繁体   English   中英

为什么我的快速排序代码在 object 数组中不起作用?

[英]Why my quicksort code doesn't work in array of object?

我在 Stack Overflow 上找不到这个问题的答案。

我有一个名为 quickSort 的quickSort

function quickSort(array, prop) {
    if (array.length <= 1) return array;

    const pivot = array[0]; // I've tried array[0][prop] but it doesn't work
    const left = [];
    const right = [];

    for (let i = 1; i < array.length; i++) {
        if (array[i][prop] < pivot) {
            left.push(array[i]);
        } else {
            right.push(array[i]);
        }
    }

    return [...quickSort(left), pivot, ...quickSort(right)];
}
console.log(quickSort(data, 'motor'));

我想按motor对这个对象数组进行排序:

let data = [
    {
        "color": "A",
        "door": 1,
        "wheel": 3,
        "year": 1963,
        "brand": "GMC",
        "sold": false,
        "owner": "Chalmers Boobyer",
        "motor": 2.6,
        "assembled": "20/08/2021"
    },
    {
        "color": "B",
        "door": 2,
        "wheel": 2,
        "year": 1980,
        "brand": "Ford",
        "sold": false,
        "owner": "Angelia Cromett",
        "motor": 2.5,
        "assembled": "02/05/2021"
    },
    {
        "color": "C",
        "door": 3,
        "wheel": 1,
        "year": 1999,
        "brand": "Audi",
        "sold": false,
        "owner": "Barth Pickring",
        "motor": 2.0,
        "assembled": "15/02/2021"
    },
    {
        "color": "D",
        "door": 4,
        "wheel": 1,
        "year": 2008,
        "brand": "Hyundai",
        "sold": true,
        "owner": "Aurore Soaper",
        "motor": 1.2,
        "assembled": "02/01/2019"
    }
];

有人可以解释我如何使array[0][prop]工作吗?

我建议阅读如何调试小程序 在比较之前和 function 的开头添加几个战略性的console.log语句来显示参数足以显示问题所在。 这次我为你做了,但如果你想作为一名程序员取得进步,你将需要能够调试自己的程序。

几个问题:

  • 您的递归调用quickSort(left)quickSort(right)缺少第二个参数prop

  • array[i][prop] < pivot如果pivot定义为array[0]是错误的,因为它比较不同的类型。 那应该是const pivot = array[0][prop]正如您尝试的那样,但是您必须将返回的数组更改为

    [...quickSort(left, prop), array[0], ...quickSort(right, prop)];

以下是应用的修复:

 const quickSort = (array, prop) => { if (array.length <= 1) return array; // warning: bad pivot const pivot = array[0][prop]; const left = []; // warning: allocations const right = []; for (let i = 1; i < array.length; i++) { if (array[i][prop] < pivot) { left.push(array[i]); } else { right.push(array[i]); } } return [...quickSort(left, prop), array[0], ...quickSort(right, prop) ]; // warning: copies }; const data = [ { color: "A", door: 1, wheel: 3, year: 1963, brand: "GMC", sold: false, owner: "Chalmers Boobyer", motor: 2.6, assembled: "20/08/2021", }, { color: "B", door: 2, wheel: 2, year: 1980, brand: "Ford", sold: false, owner: "Angelia Cromett", motor: 2.5, assembled: "02/05/2021", }, { color: "C", door: 3, wheel: 1, year: 1999, brand: "Audi", sold: false, owner: "Barth Pickring", motor: 2.0, assembled: "15/02/2021", }, { color: "D", door: 4, wheel: 1, year: 2008, brand: "Hyundai", sold: true, owner: "Aurore Soaper", motor: 1.2, assembled: "02/01/2019", }, ]; console.log(quickSort(data, "motor"));

bug修复后,排序还是有问题:

  • 递归排序不应分配 memory 并复制 arrays。使用索引确定递归子数组并交换以将元素移动到正确的子数组中。 这使代码更难编写和阅读,但提供了显着的性能改进。
  • 选择 pivot 作为 0 意味着您将达到二次复杂度并冒着破坏已排序数据的调用堆栈的风险。 研究并选择更好的枢轴选择方法。
  • 指定prop非常有限。 最好提供一个类似于内置排序的回调,这样你就可以对任何对象进行排序,而不仅仅是顶级 prop。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM