深夜深入理解快速排序(含每一步排序过程)

嗷嗷嗷
今天晚上看面经的时候刷到了快排,就把快排的具体细节实现来分享一下:


public class 快排 {
    public static void main(String[] args) {
        int[] a = {12,20,5,16,15,1,30,45,23,9};
        int left=0;
        int right=a.length-1;
        System.out.println(Arrays.toString(quickSort(a, left, right)));

    }
    private static int[] quickSort(int[] a, int start, int end) {
        int left=start;
        int right=end;
        if(left>=right){
            return a;
        }
        int pivotIndex = partition(a,start,end);
        quickSort(a,start,pivotIndex-1);
        quickSort(a,pivotIndex+1,end);
        return a;
    }


    private static int partition(int[] a, int start, int end) {
        int left=start;
        int right=end;
        //取第一个元素为基准元素
        int pivot = a[left];
        while (left!=right){
            while (left<right&&a[right]>pivot) {
                //从最右边开始,一直找到右边第一个比基准值小的数据
                right--;
            }
            while (left<right&&a[left]<=pivot){
                //从左边开始,一直找到左边比基准值大的数据
                left++;
            }
            if(left<right){
                int t=a[left];
                a[left]=a[right];
                a[right]=t;
            }

        }
        //pivot和指针重合点交换
        int t=a[left];
        a[left]=a[start];
        a[start]=t;
        return left;
    }
}

每一步的具体过程如下:"[""]"符号代表已经到位的数据



    第一次:
    12,20,5,16,15,1,30,45,23,9
    left(pivot)             right
    12,9,5,16,15,1,30,45,23,20
    pivot
     (left)                 right
    12,9,5,16,15,1,30,45,23,20
    pivot left  right
    12,9,5,1,15,16,30,45,23,20
    pivot left  right
    12,9,5,1,15,16,30,45,23,20
    pivot left(right)
    第二次:
    1,9,5,12,15,16,30,45,23,20
    1,         9,      5,         [12]       15       16,       30,     45,     23,     20
    pivot(left)       right             pivot(left)                                   right
    1,          9,      5,        [12]       15       16,       30,     45,     23,     20
    pivot(left/right)                     pivot(left/right)
    第三次:
    [1]     9,      5,      [12],[15]       16,         30,         45,         23,         20
      pivot(left)  right                  pivot(left)                                     right
    [1]     5,     9,      [12],[15]        16,         30,         45,         23,         20
    pivote(left/right)                  pivot(left/right)
    第四次:
    [1],[5],[9],[12],[15],[16],         30,         45,         23,         20
                                    pivot(left)                           right
    [1],[5],[9],[12],[15],[16],         30,         45,         23,         20
                                    pivot(30)      left                   right
    [1],[5],[9],[12],[15],[16],         30,         20,         23,         45
                                    pivot                     left(right)
    [1],[5],[9],[12],[15],[16],         30,         20,         23,         45
                                                              pivot
    第五次:
    [1],[5],[9],[12],[15],[16],         30,         20,         [23],45
                                    pivot(left)     right           pivot(left/right)
    [1],[5],[9],[12],[15],[16],         20,         30,         [23],45
                                    pivot(left/right)               pivot(left/right)
    [12],[20],[5],[16],[15],[1],[30],[45],[23],[9]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值