快速排序

这是我参与更文挑战的第5天,活动详情查看: 更文挑战

快速排序是首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,然后再按此方法对这两部分数据分别进行快速排序,让整个数据变成有序序列。

批注 2021-06-05 142844.png
如图所示,现在有一个数组,我们想要让它用快速排序的方法排好序列,首先把4作为关键数据,然后有两个部分,一个是4左侧比它小的部分,一个是右侧比它大的部分。

批注 2021-06-05 142906.png
如图所示,有两个指针,分为左指针和右指针,两个指针依次和关键数据4做比较

批注 2021-06-05 144250.png
首先1和4比较,1比4小,那么1不用换位置,接着7和4比较,7比4大,也不用换位置

批注 2021-06-05 144423.png
然后6和4比较,6比大,应该放到右边,然后8和4比较,8比4,不用换位置

批注 2021-06-05 144423.png
然后2和4比较,2比4小,需要放到左边去

批注 2021-06-05 144527.png
然后2和6互换位置,然后9和4比较,9比4大,需要换位置

批注 2021-06-05 144552.png
然后3和4比较,3比4小,需要换位置

批注 2021-06-05 144630.png
然后3和9互换位置,最后将关键数据放到这两部分的中间,然后再用同样的办法,将左右两部分的数据排序,这就是快速排序的大概思路

代码实现

var arr = [4,1,6,9,3,2,8,7];
function swap(arr,a,b){
    var temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}
function quickSort2(arr,begin,end){
    if(begin >= end -1) return;
    var left = begin;
    var right = end;
    do{
        do left++;while(left < right && arr[left] < arr[begin]);
        do right--;while(right > left && arr[right] > arr[begin]);
        if(left < right) swap(arr,left,right)
    } while (left < right);
    var sawpPoint = left == right ? right - 1:right;
    swap(arr,begin,swapPoint);
    quickSort2(arr,begin,swapPoint);
    quickSort2(arr,swapPoint + 1,end);
    
    }
}
function quickSort(arr){
    quickSort2(arr,0,arr.lenght);
}
quickSort(arr);
conole.log(arr);

复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享