排序算法-快速排序(java多种实现)

  快速排序是一种要求时间最快的排序算法,其基本原理如下:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

第一种实现

实例:
快排实例图

实现:

public int getMiddle(int[] list, int low, int high) {
    int tmp = list[low]; // 数组的第一个作为中轴
    while (low < high) {
        while (low < high && list[high] >= tmp) {
            high--;
        }

        list[low] = list[high]; // 比中轴小的记录移到低端

        while (low < high && list[low] <= tmp) {
            low++;
        }

        list[high] = list[low]; // 比中轴大的记录移到高端
    }

    list[low] = tmp; // 中轴记录到尾
    return low; // 返回中轴的位置
}

public void quickSort(int[] list, int low, int high) {
    if (low < high) {
        int middle = getMiddle(list, low, high); // 将list数组进行一分为二
        quickSort(list, low, middle - 1); // 对低字表进行递归排序
        quickSort(list, middle + 1, high); // 对高字表进行递归排序
    }
}

第二种实现

public static void quickSort(int[] numbers, int start, int end) {   
    if (start < end) {   
        int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)   
        int temp; // 记录临时中间值   
        int i = start, j = end;   
        do {   
            while ((numbers[i] < base) && (i < end))   
                i++;   
            while ((numbers[j] > base) && (j > start))   
                j--;   
            if (i <= j) {   
                temp = numbers[i];   
                numbers[i] = numbers[j];   
                numbers[j] = temp;   
                i++;   
                j--;   
            }   
        } while (i <= j);   
        if (start < j)   
            quickSort(numbers, start, j);   
        if (end > i)   
            quickSort(numbers, i, end);   
    }   
}

第三种实现

public static List<Integer> quicksort(final List<Integer> numbers){
    if(numbers.size() <2)
        return numbers;

    final Integer pivot = numbers.get(0); // 选定的基准值(第一个数值作为基准值)   
    final List<Integer> lower = new ArrayList<Integer>();
    final List<Integer> higher = new ArrayList<Integer>();

    for(int i = 1; i < numbers.size();i++){
        if(numbers.get(i) < pivot)
            lower.add(numbers.get(i));
        else 
            higher.add(numbers.get(i));
    }

    final List<Integer> sorted = quicksort(lower);  //比基准值低的数再递归排序

    sorted.add(pivot);   //基准值在中间
    sorted.addAll(quicksort(higher));    //比基准值大的数再递归排序

    return sorted;
}

输出结果

public static void main(String[] args) {
    int a[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 34, 15, 35, 25,53, 51 };
    quickSort(a, 0, a.length - 1);
    System.out.println("从小到大快速排序:" + Arrays.toString(a));
}

打印结果:

从小到大快速排序:[5, 12, 13, 15, 25, 27, 34, 34, 35, 38, 49, 49, 51, 53, 64, 65, 76, 78, 97]

文章目录
  1. 1. 第一种实现
  2. 2. 第二种实现
  3. 3. 第三种实现
  4. 4. 输出结果