手写一个快排(Java版)

  /**
 * @Author: Crystal
 * @Date: 2018/10/24 9:43
 **/
public class QuikSort {

    public static void quickSort(int a[], int start, int end) {
        if (start >= 0 && end <= a.length - 1 && start < end) {
            int low = start;
            int hign = end;
            //记录一个关键值 spiltKey
            int spiltKey = a[start];

            //遍历数组
            while (start < end) {
                //从后向前比较,直到遇到比spiltKey小的数
                while (start < end && a[end] >= spiltKey) end--;
                //交换位置
                a[start] = a[end];
                //从前向后比较,直到遇到有比spiltKey大的数
                while (start < end && a[start] <= spiltKey) start++;
                //交换位置
                a[end] = a[start];
            }

            /**
             * 此时第一次循环比较结束,关键值的位置已经确定了。
             * 左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
             */
            a[end] = spiltKey;
            //递归,再对左半部分排序
            quickSort(a, low, start - 1);
            //递归,再对右半部分排序
            quickSort(a, start + 1, hign);
        }
    }

    public static void main(String[] args) {
        int[] a = {1, 9, 6, 7, 2, 3, 8, 5};
        quickSort(a);
    }

    public static void quickSort(int[] a) {
        long t1 = System.nanoTime();
//        System.out.println("##开始时间: " + t1);
        quickSort(a, 0, a.length - 1);
        long t2 = System.nanoTime();
//        System.out.println("##结束时间" + t2);
        System.out.println("##耗时:" +  String.format("%.8fs", (t2 - t1) * 1e-9));
        for(int i : a){
            System.out.println(i);
        }
    }

}

你可能感兴趣的:(手写一个快排(Java版))