我们一般使用的双for排序,无论是冒泡排序还是查询排序 都会有大量的无效比较,不能记录排序的值,而快排是使用二分法结合随机数进行等概率排序,能把时间效率降低到较低的一种方法。
首先思路是利用数组中最后一个元素对整个数组进行比较,比他大的放一边,比他小的放另一边,就得到一个以最后一个元素为分界岭的两组数据,然后利用递归再次进行排序即可。
简单方案;
function kp(list,map=[]){
if(list.length<=1){ //二分边界条件
return list
}
let k = list.length-1;
let left = 0
let right = k-1
let index = 0
while(index<=right){
if(list[index]<list[k]){
[list[index],list[left]] = [list[left],list[index]]
index++ //为小则++ left++
left++ //界限是l-1
}else if(list[index]==list[k]){
index++
}else{
[list[index],list[right]] = [list[right],list[index]]
right-- // 界限是right+1 为大替换位置后再次判断换过来的值
}
}
let us = list.slice(left,right+1)
let lefts = kp(list.slice(0,left))
let rights = kp(list.slice(right+1,k))
return [...lefts,...us,list[k],...rights]
}
这样的话 最不理想的条件为O(n^2)
利用随机数进行随机化,让理想条件和不理想条件均分
function kp(list,map=[]){
if(list.length<=1){
return list
}
let k = list.length-1;
let ran = Math.floor(Math.random()*list.length);
[list[ran],list[list.length-1]] = [list[list.length-1],list[ran]]
let left = 0
let right = k-1
let index = 0
while(index<=right){
if(list[index]<list[k]){
[list[index],list[left]] = [list[left],list[index]]
index++
left++ //界限是l-1
}else if(list[index]==list[k]){
index++
}else{
[list[index],list[right]] = [list[right],list[index]]
right-- // 界限是right+1
}
}
let us = list.slice(left,right+1)
let lefts = kp(list.slice(0,left))
let rights = kp(list.slice(right+1,k))
// console.log(list.slice(0,left),list.slice(right+1,k))
return [...lefts,...us,list[k],...rights]
}
这样就完成了