简单快速排序算法

import cn.idestiny.util.GeneratedArray;

/**
 * @Auther: FAN
 * @Date: 2018/8/26 19:48
 * @Description:快速排序
 **/
public class QuickSort {

    public static void main(String[] args) {
        int[] arr = GeneratedArray.randomGeneratedArray(1, 10, 1000000);
        long start = System.currentTimeMillis();
        quickSort(arr);
        GeneratedArray.isSorted(arr);
        System.out.println(System.currentTimeMillis() - start);
    }

    private static void quickSort(int[] arr) {
        quickSort(arr, 0, arr.length - 1);
    }

    private static void quickSort(int[] arr, int left, int right) {

//        if(left>=right){
//            return;
//        }

        //当数组长度过小时,采用插入排序,这样可以优化排序速度
        if (right - left <= 15) {
            insertionSort(arr, left, right);
            return;
        }
        //进行partition
        int p = partition(arr, left, right);
        //递归左范围
        quickSort(arr, left, p - 1);
        //递归右范围
        quickSort(arr, p + 1, right);

    }

    /**
     * 对arr[left...right]部分进行partition操作
     * 简单快速排序算法
     * @param arr
     * @param left
     * @param right
     * @return 返回p, 使得arr[left...p-1]<arr[p] arr[p+1...right]>arr[p]
     */
    private static int partition(int[] arr, int left, int right) {
        //随机选择数组中一个位置,与数组首位进行交换,
        GeneratedArray.swap(arr, left, (int) (Math.random() * (right - left + 1)) + left);
        //选择数组中第一个元素作为标志
        int v = arr[left];

        //arr[left+1...j] < v  arr[j+1...right]>v
        int j = left;

        for (int i = left + 1; i <= right; i++) {
            if (arr[i] < v) {
                //如果arr[i] < v 那么就把arr[i]加入到[left+1...j]中
                GeneratedArray.swap(arr, j + 1, i);
                j++;
            }
        }
        GeneratedArray.swap(arr, j, left);
        return j;
    }

    private static void insertionSort(int[] arr, int left, int right) {

        for (int i = left + 1; i <= right; i++) {
            int key = arr[i];
            int j = i - 1;
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }

    }

}
原文地址:https://www.cnblogs.com/lfdestiny/p/9539527.html