快速排序

简介

快速排序是冒泡排序的一种改进。开发中,快速排序用的非常多

  • 选择排序的思想也非常简单
    • 通过一趟排序将要排序的数据分割成独立的两部分,其中前一部分的所有数据都比另外后一部分的所有数据都要小。
    • 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

核心代码

public class QuickSort {

    public void quick(int [] a){
        if (a.length > 0) {
            quickSort(a, 0, a.length-1);
        }
    }

    /**
     * 快速排序
     * @param a
     * @param i
     * @param j
     */
    private void quickSort(int[] a, int low, int high) {
        if (low < high) {
            int middle = getMiddle(a, low, high);
            quickSort(a, 0, middle-1);
            quickSort(a, middle + 1, high);
        }
    }

    /**
     * 获取中间下标
     * @param a
     * @param low
     * @param high
     * @return
     */
    private int getMiddle(int[] a, int low, int high) {
        int temp = a[low]; // 基准元素
        while (low < high) {
            while (low < high && a[high] >= temp) {
                high--;
            }
            a[low] = a[high];
            while (low < high && a[low] <= temp) {
                low++;
            }
            a[high] = a[low];
        }
        a[low] = temp; // 插入到排序后正确的位置
        return low;
    }

    public static void main(String[] args){
        QuickSort quickSort = new QuickSort();
        int [] a = {19, 2, 3, 90, 67, 33, -7, 24, 3, 56, 34, 5};
        quickSort.quick(a);
        for (int num :a) {
            System.out.println(" " + num);
        }
    }
}
  • quickSort()函数内采取先序方式进行递归
    • 第一次调用getMiddle()将数组分成两部分,前一部分的任何值都比后一部分的任何之小。
    • 然后递归这前一部分,再递归后一部分。
    • 这样一变二,二变四,四变八。。。每一部分都进行排序
    • 回归时,就成了一个有序的序列。

优缺点

  • 优点

    • 快,数据移动少
    • 开发使用多
    • 在平均情况下是的排序算法中时间常数最小的,但是最坏情况下会退化到O(n^2)
  • 缺点

    • 不稳定

复杂度

  • 时间复杂度

    • O(n*logn)
  • 空间复杂度

    • O(1)
    • 最优的情况下空间复杂度为:O(logn) ,每一次都平分数组的情况
    • 最差的情况下空间复杂度为:O( n ),退化为冒泡排序的情况
  • 稳定度

    • 不稳定

应用场景

  • 当数量在50以内

    • 可以使用插入或选择
  • 当数量比较大

    • 可以使用快速排序、堆排序和归并排序。

你可能感兴趣的:(算法)