快速排序

128 阅读2分钟

这是我参与更文挑战的第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 swapPoint = 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.length);
}
quickSort(arr);
console.log(arr);