快速排序

85 阅读1分钟

快速排序分两步:

1.选择一个基数,整个数组,小于基数的放在左边,大于基数放在右边。这里用了双指针复杂度是O(n),空间O(1)

2.开始分治递归。在对左右数组进行第一步操作。时间复杂度O(logn),空间复杂度O(logn)。递归栈用的空间。

也就是说,在最优的情况下,快速排序算法)的时间复杂度为O(nlogn)。

最坏的情况

待排序的序列为正序或者逆序,每次划分只得到一个比上一次划分少一个记录的子序列,注意另一个为空。如果递归树画出来,它就是一棵斜树

此时需要执行n‐1次递归调用,最终时间复杂度为O(n^2)。

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {-9,78,0,23,-567,70};
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }


    public static void quickSort(int[] arr,int left,int right){
        if (left >= right){
            return;
        }
        //下面是单个数组,进行一次基数在中间大小的方法,接下来我们要开始分治
        int i = left;int j = right;
        int num = arr[i];
        while(i != j){
            //找到小于基数停止,大于等于基数一直移动.
            //注意这里不能把两个while()循环颠倒。否则最后停在的数字,应该是大于基数。
            //我们这样把J--放在前面,可以方便直接在最后和基数交换
            while(i < j && arr[j] >= num){
                j--;
            }
            while (i < j && arr[i] <= num){
                i++;
            }
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        arr[left] = arr[i];
        arr[i] = num;

        quickSort(arr,left,i - 1);
        quickSort(arr,i+1,right);
    }
}