java数据结构和算法-3,快速排序

来源:互联网 发布:c语言随机数头文件 编辑:程序博客网 时间:2024/06/07 09:58

快速排序:

1.来自度娘:
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
2.和插入排序以及二分法都有共同点

快速排序不知道是性能上面快速还是什么,反正没测试过,看来得找个时间测试一下这些排序所用的时间才是,好,记一个!!
废话不多,码上见!

public class FastSort {    /**       * @Description 这个方法是用来把数组分分成两部分并根据参照点稍作位置调整数组元素位置的     * @param arr 用来排序的数组     * @param left 初始是数组的最左端索引,然后从第二次递归开始就由 point 决定,起到位置索引作用     * @param right 初始是数组的最右端索引,然后从第二次递归开始就由 point 决定,起到位置索引作用     * @param point 参照点,初始是初始是数组的最右端元素,然后从第二次递归开始就是 被划分成两部分的数组的两个最右端元素     * @return int 和参照点类似,返回的是参照点所在位置的前一个位置     * @throws     */    public static int partition(int[] arr, int left, int right, int point) {        int leftP = left -1;//leftP起指针作用,记录准备要交换位置的元素的索引        int rightP = right;//rightP起指针作用,记录准备要交换位置的元素的索引        while(true){            while (leftP < rightP && arr[++leftP] < point);//用参照点从左往右一直对比,直到找到比参照点大的数就停下            while (rightP > leftP && arr[--rightP] > point);//用参照点从右往左一直对比,直到找到比参照点小的数就停下            if (leftP >= rightP) {//如果条件符合,证明左右两头往中间已经相遇并对比完所有元素                break;            }else{                int temp = arr[leftP];//用刚才左右两头停下所记录的位置交换元素,这里的交换只是把小的元素移到左边,大的移到右边                arr[leftP] = arr[rightP];                arr[rightP] = temp;            }        }        int temp = arr[leftP];//当上面的while循环都停止后,leftP 所在位置的元素就是大于或等于 参照点 的元素,所以把最大的放后面        arr[leftP] = arr[right];        arr[right] = temp;        return leftP;//返回左边开始的索引位置,用于下一轮切分数组    }    /**       * @Description 排序的方法,要用到递归     * @param arr 用于排序的数组     * @param left 这里的左并不一定是数组的最左索引位置,也有可能是数组切分后的左边     * @param right 和 left 同理     * @throws     */    public static void sort(int[] arr, int left, int right){        if (left >= right) {//排序结束            return;        }else{            int point = arr[right];//参照点是数组切分后的最右边元素            int partition = partition(arr, left, right, point);//把数组切分,并把大于参照点的值放在右边,小于的放左,            sort(arr, left, partition -1);//把切分后的数组继续且            sort(arr, partition +1 , right);//切到最后就是排序结束,此时发现已经排好序了        }    }    public static void main(String[] args) {        int[] arr = {19,4,6,65,15,2,0,12,13,20,25};        sort(arr, 0, arr.length - 1);        for (int i = 0; i < arr.length; i++) {            System.out.print(arr[i]+" ");        }    }}

输出结果:

0 2 4 6 12 13 15 19 20 25 65 

重点:

  1. 弄清楚切分的原理,实际上是一边切一边排序
  2. 实际上每次切分之后右边部分都已经排好序没用了
原创粉丝点击