zoukankan      html  css  js  c++  java
  • 快速排序

    /**
    * 快速排序:当今公认的最好的排序算法之一,它是对冒泡排序的一种改进。
    * 思想是将要排序的数组氛围独立的两部分,其指一部分的所有数组元素值比
    * 另一部分的所有元素值都要小,而每一小部分数组的排序又可以继续分解为更
    * 小的两部分,这样递归分解下去,直到数组长度的大小最大为2.
    */

    public class Quick {

    public static void main(String[] args) {
    Quick quick=new Quick();
    int [] arr=quick.ary();
    quick.fastSort(arr, 0, arr.length-1);
    for(int i=0;i<arr.length;i++){
    System.out.print(arr[i]+" ");
    }
    System.out.println();
    }
    //获取数组
    public int [] ary() {
    //确定数组的长度,控制台输入
    Scanner scanner=new Scanner(System.in);
    System.out.print("请选择数组的长度:");
    int [] arr=new int[scanner.nextInt()];
    //产生随机数
    Random rand=new Random();
    //将产生的随机数添加到数组中
    for(int i=0;i<arr.length;i++){
    arr[i]=rand.nextInt(500);
    System.out.print(arr[i]+" ");
    }
    System.out.println();
    return arr;
    }
    //进行快速排序

    /**
    今天介绍快速排序,这也是在实际中最常用的一种排序算法,速度快,效率高。
    就像名字一样,快速排序是最优秀的一种排序算法。

    思想:快速排序采用的思想是分治思想。

    快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,
    使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整
    到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素
    都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准
    的位置以及调整返回基准的最终位置以便分治递归。

    举例说明一下吧,这个可能不是太好理解。假设要排序的序列为
    2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,
    把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移

    2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置

    2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面

    2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变

    经过第一轮的快速排序,元素变为下面的样子

    [1] 2 [4 9 3 6 7 5]
    之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。
    */
    public void fastSort(int [] arr,int left,int right){
    if(left<right){
    int a=arr[left];
    int b=left;
    int c=right;
    while(b<c){
    while(b<c&&arr[c]>a) {c--;}
    arr[b]=arr[c];
    while(b<c&&arr[b]<a) {b++;}
    arr[c]=arr[b];
    }
    arr[b] = a;
    fastSort(arr,left,b-1);
    fastSort(arr,b+1,right);

    }
    }

  • 相关阅读:
    实例属性 类属性 实例域 类域
    研究数据集
    static 静态域 类域 静态方法 工厂方法 he use of the static keyword to create fields and methods that belong to the class, rather than to an instance of the class 非访问修饰符
    accessor mothod mutator mothod 更改器方法 访问器方法 类的方法可以访问类的任何一个对象的私有域!
    上钻 下钻 切片 转轴 降采样
    识别会话
    Performance Tuning Using Linux Process Management Commands
    Secure Hash Algorithm 3
    grouped differently across partitions
    spark 划分stage Wide vs Narrow Dependencies 窄依赖 宽依赖 解析 作业 job stage 阶段 RDD有向无环图拆分 任务 Task 网络传输和计算开销 任务集 taskset
  • 原文地址:https://www.cnblogs.com/sort/p/7773265.html
Copyright © 2011-2022 走看看