算法通关村第十关——快速排序青铜挑战笔记

本篇内容主要巩固快速排序过程,总结形成区别于以往快排模板的新快速排序模板,该模板初次理解有一定难度,但理解一次后该模板逻辑清晰明了,有利于进一步理解巩固快速排序过程,务必自主对该模板进行探索,总结自己的经验心得!

快速排序模板

快速排序是怎么进行的?对于指定区间[start,end],首先选取一个枢轴元素pivot,一次排序结束后,原来区间被分割成两部分,左半部分元素小于等于pivot,右半部分元素大于等于pivot,然后对左半部分和右半部分“依次”进行快排。需要特别注意的是,只有区间长度为1时,元素才被排序到指定位置上,类似于达到了树的叶子节点。依据这个逻辑就可完成快速排序!

当左侧元素大于pivot或右侧元素小于pivot该怎么处理?答:双指针!

使用双指针从区间两侧对撞型遍历,左指针从左侧寻找大于(不小于)pivot的元素,右指针从右侧寻找小于(不大于)pivot的元素,找到后将两个元素互换位置,即可满足左半部分元素小于等于pivot,右半部分元素大于等于pivot。

上代码看一下!

    private static void myQuickSort(int[] array, int start, int end) {
        if(start >= end) return;
        int left = start, right = end;
        int pivot = array[(left + right) / 2];
        //将序列按照pivot大小分成左右两部分
        while(left <= right){
            //从左侧找比pivot大的元素(不小于)
            while(array[left] < pivot) left++;
            //从右侧找比pivot小的元素(不大于)
            while(array[right] > pivot) right--;
            //交换位置
            if(left <= right){
                int temp = array[left];
                array[left] = array[right];
                array[right] = temp;
                left++;
                right--;
            }
        }
        myQuickSort(array,start,right);
        myQuickSort(array,left,end);
    }

OK,《算法通关村第十关——快速排序青铜挑战笔记》结束,喜欢的朋友三联加关注!关注鱼市带给你不一样的算法小感悟!(幻听)

再次,感谢鱼骨头教官的学习路线!鱼皮的宣传!小y的陪伴!ok,拜拜,第十关第二幕见!

你可能感兴趣的:(笔记)