簡體   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