[数据结构]快速排序算法JavaScript版

版权声明:转载需注明来源 https://blog.csdn.net/Xiao_Spring/article/details/79175313

快排基本思路

  1. 找出一个切割点
  2. 找到切割点左右部分的切割点,直到每个被分割的小团体只含一个数字

原理讲解

这里写图片描述

在这里我们有一个长度为7的无规则数字数组,我们将用快排的方法将它从小到大排序。

第一步——找到切割点

一般地,我们选用团体中的第一个元素为切割点,在上图中即为2

第二步——以切割点为主体,逐个比较大小并重新置位

因为我们是比较切割点与其他元素的大小,所以我们的遍历范围是整个数组,需要两个标志量——low和high

初步设计成先用切割点值key从数组[high]向前比较,如下图

这里写图片描述

此时high = 2,low = 0,数组[0]处的值将被数组[2]=1代替:

这里写图片描述

其中,绿色表示已经被比较过的数组位置(值)

然后,再从low开始比较,找出比切割点值2大的数,索引为1,将数组[1]的值填到上一轮标黄处,即:

这里写图片描述

此时,low=1,high = 2,显然经过刚才的比较 <1的数组元素均小于切割点值,>2的数组元素均大于切割点值,因此切割点应放在索引为1处。

3——将左右部分重复步骤2直到各部分元素数量均为1

这里就有一种树的思想,即由节点控制路径,最终分配到每个可能的叶子节点。

源码

/*
    1、sort函数 运用分治的思想 切换数组 逐渐消化
    2、partition 找到切割位置 切割点左侧不大于切割点值 右侧大于切割点值
    3、quickSort 提供给外部调用的快速排序方法 不暴露索引值
*/

function partition(arr,low,high){
    var key = arr[low];
    while(low < high){
        //第一层循环 先后->前 然后前->后
        while(arr[high]>=key && low < high){
            high--;
        }
        arr[low] = arr[high];
        while(arr[low]<=key && low < high){
            low++;
        }
        arr[high] = arr[low];
    }
    arr[high] = key;
    //此时的low和high相等 所以返回high也可以
    return low;
}

function sort(arr,low,high){
    if(low >= high){
        return;
    }
    var index = partition(arr,low,high);
    sort(arr,low,index-1);
    sort(arr,index+1,high);
    return arr;
}

function quickSort(arr){
    let res = sort(arr,0,arr.length-1);
}
//待排序的数组
var nums = [1,3,7,4,6];
quickSort(nums);
console.log(nums);

结果测试

这里写图片描述

这里是源码的github地址,由于本人水平有限,难免会出现错误,希望大家不吝赐教~

https://github.com/YuanshuaiHuang/JS-/blob/master/code/20180126

猜你喜欢

转载自blog.csdn.net/Xiao_Spring/article/details/79175313