一, 序言(内容与代码无关)
之前看了一下百度百科的快速排序算法,所以现在就想写下加深点印象。代码在最下方,前面是我个人理解。
二, 看图说话
我这个图是在百度百科上拉取的,百度百科是动态的,我的不能动抱歉,要看原图地址的来这,我这里直接根据原始图片来讲解了。
2.1 快速排序
第一步: 在一个数组内确定一个基准值,
第二步: 通过这基准值将数组分成左右俩个数组,
第三步: 重复前两步就可以了。
要是不明白看下这个图片。
每次排序的目的: 就是在每次排序的时候,把基准值都排到数组的“中间”(数据大小的中间),基准值的左侧都是比她小的,基准值的右侧都是比她大的值,按比较容易理解的想法就是,每次我们只是找出基准值的正确位置。
三,代码区
var arr = [101,5,199,95,97,97,100]; //需要处理的数组
function quickSort(arr,_begin,_end){
var i=_begin;
var j=_end;
var key = arr[_begin]; //基准值(为了便于排序建议取第一个或最后一个,这里取数组第一个)
if(i>= j){ //如果数组只有一个元素
return;
}
while(i<j){ //开始值小于结束值时,数组数据一直进行对比
while(i<j&&arr[j]>key){ //首先从后往前找,找出比基准值小的记下位置信息,
j--;
}
while(i<j&&arr[i]<=key){ //接着从前往后找,找出比基准值大的记下位置信息,
i++;
}
if(i<j){ //从上述对比的数据结果中,找出符合条件的数据位置进行调换,
var temp=arr[i];
arr[i] = arr[j];
arr[j]= temp;
}
}
这里我们那第一次排序结束为案例,(记住一点每次排序的目的)。
// console.log( "原数组位置未发生变化,但第一次排序已经结束,此时 i==j",arr,i,j)
arr[_begin] = arr[i]; //原数组中间位置数据放在原基准值位置,(j,i)
// console.log( "原数组中间位置数据与基准值位置对调",arr,i,j)
arr[i] = key; //将原基准值放在新数组的中间,区分出左右两组数据,左边小于基准值,右边大于基准值。
// console.log( "得出第一次排序的最终数组",arr,i,j)
// debugger //这里打的debugger为了方便我们看每进行一次排序后数组的结果
上述只是找出了一个基准值的位置,并且将数组由基准值值位置分成了两个小数组
quickSort(arr,_begin,i-1); //左侧的数组进行上述操作,
quickSort(arr,i+1,_end); //左侧数组排序完后,右侧数组重复上述操作。
return arr;
}
quickSort(arr,0,arr.length-1)
console.log(arr)
四, 总计
这次的文章主要还是根据百度百科,里面还包含了许多其他语言的快排方法,觉得百度百科牛人还真是多啊!加油!!!。
参考地址:https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/369842?fromtitle=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F&fromid=2084344&fr=aladdin