排序算法——快速排序详解(java实现)

来源:互联网 发布:高晓松 阿里 知乎 编辑:程序博客网 时间:2024/06/05 13:13
/** * Created by yuyufeng on 2016/11/23. * 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 */public class QuickSort {    //我使用了两边向推进找值对比pivot交换    public static void sort(int left, int right, int[] arr) {        int tempValue;        int l = left;        int r = right;        //取得中间数标的值        int pivot = arr[(left + right) / 2];   //快速排序优化的关键点就在于划分算法,我们这里不做处理就取中间值        while (l < r) {            //找到左边比pivot大的坐标            while (arr[l] < pivot && l < r) {                l++;            }            //同上            while (arr[r] > pivot && l < r) {                r--;            }            //如果l>=r,则说明左边的值都小于右边的值了,二分已经完毕,那就不用交换,故直接break即可。            if (l >= r) {                break;            }            //交换            tempValue = arr[l];            arr[l] = arr[r];            arr[r] = tempValue;        }        //l==r 则说明两边查找进度已经重叠,该值为pivot的坐标,排序位置已经确定,故不需要再参与二分。        if (l == r) {            l++;            r--;        }        //递归        //当前数组左边区间继续二分        if (left < r) {            sort(left, r, arr);        }        //当前数组右边继续区间二分        if (l < right) {            sort(l, right, arr);        }        //如果left == r,right == l 则说明二分区间已经为0了,排序完毕,递归出口    }    public static void main(String[] args) {        int[] myArr = {2, 5, 4, 9, 3, 6, 8, 7, 1, 0};        sort(0, myArr.length - 1, myArr);        for (int i = 0; i < myArr.length; i++) {            System.out.print(myArr[i] + " ");        }        System.out.println();    }}/** * 排序过程(递归): * 2 5 4 9 3 6 8 7 1 0 * 2 0 1 3 9 6 8 7 4 5 * 0 2 1 3 9 6 8 7 4 5 * 0 1 2 3 9 6 8 7 4 5 * 0 1 2 3 5 6 4 7 8 9 * 输出结果: * 0 1 2 3 4 5 6 7 8 9 **/

1 0
原创粉丝点击