快排思想阮一峰老师曾经写过,但是那并不是最正确的算法,不断创建新的数组,会增加空间复杂度;而且通过splice方法提取基准点,由于v8引擎对于splice方法处理的时间负责度为O{n},所以性能会降低,但是不管怎么说,阮一峰老师的排序基本思想是正确的,选取一个基准点,小的放在前面,大的放在后面,依次递归;这对于理解标准的排序算法会有很大的帮助;
function quickSort(arr,left,right){
let len = arr.length;
left = left!==undefined ? left:0;
right = right!==undefined ? right:len-1;
// 递归,终止条件是left>=right
if(left<right){
let index = sortAndFindIndex(arr,left,right);
quickSort(arr,left,index-1);
quickSort(arr,index+1,right)
}
return arr
}
// 小于基准点的放在前面,大于基准点的放在后面,并获取基准点的索引
function sortAndFindIndex(arr,left,right){
// 获取当前基准点索引对应的值
const baseValue = arr[left];
let index = left+1;
for(let i =index;i<=right;i++){
if(baseValue>arr[i]){
swap(arr,index,i)
index++
}
}
// -1是因为最后依次符合条件的i加1了
swap(arr,index-1,left);
return index-1
}
function swap(arr,i,j){
let temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
上面这个方法,是原地排序的,只需要递归的内存空间,空间复杂度为log{n},非常值得查阅;