如何解决是否可以在快速排序中使用slice?
我正在学习快速排序,这是下面的代码:
const pivot1 = (arr,low = 0,high = arr.length -1) => {
let pivot = arr[low];
let index = low;
for(let i = low + 1; i <= high; i++){
if(pivot > arr[i]){
index++;
[arr[index],arr[i]] = [arr[i],arr[index]];
}
}
[arr[low],arr[index]] = [arr[index],arr[low]];
return index;
}
const quickSort1 = (arr,high = arr.length - 1) => {
if(low < high){
let pivot = pivot1(arr,low,high);
quickSort1(arr,pivot - 1);
quickSort1(arr,pivot + 1,high);
}
return arr;
}
console.log(quickSort1([5,2,1,8,4,7,6,3])); // [1,3,5,8]
但是,如果我不想设置low
和high
参数,并尝试在slice()
函数表达式中使用quickSort2
,则似乎有问题排序,我不知道(递归无法正常工作)。有人可以告诉我为什么吗,如果我像{子一样顽固地使用slice()
,我是否仍然可以让该函数正常工作?
p.s。,我将枢轴更改为pivot2
函数表达式中的最后一个元素,因此pivot2
与pivot1
有点不同。
const pivot2 = (arr) => {
let pivot = arr[arr.length - 1];
let index = -1;
for(let i = 0; i < arr.length - 1; i++){
if(pivot > arr[i]){
index++;
[arr[index],arr[index]];
}
}
[arr[arr.length - 1],arr[index + 1]] = [arr[index + 1],arr[arr.length - 1]];
return index + 1;
}
const quickSort2 = (arr) => {
if(0 < arr.length - 1){
let pivot = pivot2(arr);
let left = arr.slice(0,pivot);
let right = arr.slice(pivot + 1);
quickSort2(left);
quickSort2(right);
}
return arr;
}
console.log(quickSort2([5,3])); // [2,5]
解决方法
您不应该使用slice,因为它不会改变下面的数组。您可以传递左右索引,也可以保存两个递归快速排序的结果并合并数组。
const left_array = quickSort2(left);
const right_array = quickSort2(right);
arr = [...left_array,...right_array];
右切片也将使用数据透视表作为参数,而不是数据透视表+1,因为切片不包含结束索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。