第2章:快速排序

156 阅读1分钟

第2章:快速排序

1 写在最前面

  • 时间复杂度 O (NlogN)

  • 顺序很重要,要先从右边开始找

** 认真看**

(1) 从右往左,a[j]的值比基准值大的,则j一直左移,直到遇到比基准值小的停下,然后a[i]从左往右遇到比基准值大的停下,交换数值,倒数第二次交换完。

(2) 每次从右往左开始找,j停在了比基准值小的数的位置上,与i相遇,将这个值与基准值交换,符合条件

(3) 要是从左往右开始找,当i停在了比基准值大的位置上,与j相遇,将这个值与基准值交换的话,就不符合条件了,也可能会出现i=j,且a[i]与a[j]的值都比基准值大

2 代码实现

public static void quickSort(int[] array,int left,int right){

        //递归推出条件
        if(left>right){
            return;
        }

        //初始化左右指针
        int i = left;
        int j = right;

        //base中存的就是基准数
        int base = array[left];

        while(i!=j){ //while(i<j)

            //顺序很重要,要先从右往左找
            //小于base才停下来
            while(array[j]>=base&&i<j){
                j--;
            }

            //再从左往右找
            //大于base才停下来
            while(array[i]<=base&&i<j){
                i++;
            }

            //交换两个数在数组中的位置
            //当哨兵i和哨兵j没有相遇时
            if(i<j){
                array[i] = array[i]^array[j];
                array[j] = array[i]^array[j];;
                array[i] = array[i]^array[j];
            }
        }

        //终将基准数归位
        array[left] = array[i];
        array[i] = base;

        //继续处理左边的,这里是一个递归的过程
        quickSort(array,left,i-1);
        //继续处理右边的,这里是一个递归的过程
        quickSort(array,j+1,right);
    }