从零开始学算法 - 快速排序

快速排序的思路:选一个基准值 current,把比它大的放在它右边,比它小的放在它左边,递归直到排序完成。

用一个10个数字的数组,解释一下快速排序的过程:

第一趟:

原始数组:[4, 47, 26, 1, 23, 74, 87, 91, 49, 43]

从右向左找小数:[4, 47, 26, 1, 23, 74, 87, 91, 49, 43]

从左向右找小数:[4, 47, 26, 1, 23, 74, 87, 91, 49, 43]

初次交换:[4, 1, 26, 47, 23, 74, 87, 91, 49, 43]

继续向中间查找:[41, 2647, 23, 74, 87, 91, 49, 43]

两队人马相遇,和基数做交换:[1, 4, 26, 47, 23, 74, 87, 91, 49, 43]

第二趟:

分成两拨:[1],[4],[26, 47, 23, 74, 87, 91, 49, 43]

对右侧数组进行一波操作:[26, 47, 23, 74, 87, 91, 49, 43]

从右向左找小数:[26, 47, 23, 74, 87, 91, 49, 43]

从左向右找大数:[264723, 74, 87, 91, 49, 43]

初次交换:[262347, 74, 87, 91, 49, 43]

继续向中间查找:[262347, 74, 87, 91, 49, 43]

两队人马相遇,和基数做交换:[23, 26, 47, 74, 87, 91, 49, 43]

以这种形式递归,直到完成整个排序。

将上述过程翻译成代码:

//把交换两个元素的方法提取出来
function swap(arr,i,j){
    var tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
//排序方法
function quickSort(arr,left,right){
    if (left < right){
        var i = left+1;
        var j = right;
        var x = arr[left];
        while (i < j){
       //从右向左找比x小的数
            while(i<j && arr[j]>=x){
                j--;
            }
       //从左向右找比x大的数
            while(i<j && arr[i]<x){
                i++;
            }
       //交换前面找到的两个数
            if(i < j){
                swap(arr,i,j);
            }
        }
     //左右下标相遇,将相遇处的数和基数值交换
        swap(arr,i,left);
     //基数值此时的下标为i,以i为分界将数组分成两部分,继续递归调用
        quickSort(arr, left, i - 1);
        quickSort(arr, i + 1, right);
    }
}
//调用方法
var array10=[];
for(var i=0;i<10;i++){
    array10[i] = Math.floor(Math.random()*100);
}
quickSort(array10,0,9);

猜你喜欢

转载自www.cnblogs.com/lynshxs/p/9863464.html