排序算法(三)—— 快速排序

基本思想:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {9,8,7,6,5,4,3,2,1};
        quickSort(arr,0,arr.length-1);
    }

    public static void quickSort(int arr[],int l,int r){
        if (l < r) {
            //调整当前数组并返回分割点位置
            int m = adjust(arr, l, r);
            //递归调整分割点左边数组
            quickSort(arr, l, m-1);
            //递归调整分割点右边数组
            quickSort(arr, m + 1, r);
        }
    }

    //以首位数字为基数,将比基数小数字放在基数左边,比基数大的数放在基数右边
    //注意,此算法是利用在同一个数组上做调整,未另开辟空间
    public static int adjust(int arr[],int l,int r){
        int i = l;
        int j = r;
        int base = arr[i];
        while (i < j){
            //从右往左找比基准点小的数,找到交换位置,找不到往左走一步继续找
            while (i < j && arr[j] >= base){
                j--;
            }
            //交换
            arr[i] = arr[j];
            //从左往右找比基准点大的数,找到交换位置,找不到往右走一步继续找
            while (i < j && arr[i] <= base){
                i++;
            }
            arr[j] = arr[i];
        }
        //i为基准点的目标位置
        arr[i] = base;
        return i;
    }
}

最优时间复杂度:O(n*logn),最坏时间复杂度O(n2)
最优空间复杂度都为:O(logn),最坏空间复杂度O(n)。空间复杂度主要是由递归造成的栈空间使用。

由于关键字的比较与交换是跳跃进行的,因此,快速排序是一种不稳定的排序方式。

参考:https://blog.csdn.net/morewindows/article/details/6684558

猜你喜欢

转载自blog.csdn.net/xybz1993/article/details/80385161