是否可以在快速排序中使用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]

但是,如果我不想设置lowhigh参数,并尝试在slice()函数表达式中使用quickSort2,则似乎有问题排序,我不知道(递归无法正常工作)。有人可以告诉我为什么吗,如果我像{子一样顽固地使用slice(),我是否仍然可以让该函数正常工作?

p.s。,我将枢轴更改为pivot2函数表达式中的最后一个元素,因此pivot2pivot1有点不同。

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,因为切片不包含结束索引。

Slice MDN reference

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...