一、基本用法
jsarray.sort()是Javascript中的一個方法,可用於對數組進行排序。這個方法可以沒有參數,也可以接受一個函數作為參數。
當沒有參數時,默認按照Unicode位碼的順序進行排序。如果需要對數字進行排序,需要使用比較函數。
const arr1 = ['banana', 'apple', 'orange']; arr1.sort(); console.log(arr1); // ['apple', 'banana', 'orange'] const arr2 = [10, 5, 20]; arr2.sort(); console.log(arr2); // [10, 20, 5] const arr3 = [10, 5, 20]; arr3.sort((a, b) => a - b); console.log(arr3); // [5, 10, 20]
以上示例展示了jsarray.sort()的基本用法。當沒有參數時,sort()方法會按照默認規則排序。當需要對數字進行排序時,需要傳入比較函數。
二、比較函數
比較函數是jsarray.sort()中重要的參數,它決定了排序的規則和結果。
比較函數有兩個參數a和b,表示需要比較的兩個元素。比較函數返回值決定了a和b在排序結果中的位置。
當返回值小於0時,a會排在b的前面;當返回值大於0時,a會排在b的後面;當返回值等於0時,a和b的相對位置不變。
const arr1 = [10, 5, 20]; arr1.sort((a, b) => a - b); console.log(arr1); // [5, 10, 20] const arr2 = [10, 5, 20]; arr2.sort((a, b) => b - a); console.log(arr2); // [20, 10, 5] const arr3 = [{name: 'apple', price: 1}, {name: 'banana', price: 2}, {name: 'orange', price: 3}]; arr3.sort((a, b) => a.price - b.price); console.log(arr3); // [{name: 'apple', price: 1}, {name: 'banana', price: 2}, {name: 'orange', price: 3}]
以上示例展示了比較函數的用法。第一個例子表示從小到大排序,第二個例子表示從大到小排序,第三個例子表示按照price屬性從小到大排序。
三、穩定排序
穩定排序是指排序前後,排序實現對於相等元素的順序不變。在實際開發中,穩定排序尤為重要。
jsarray.sort()默認是非穩定排序,但是可以通過比較函數實現穩定排序。
const arr1 = [{name: 'apple', price: 1}, {name: 'banana', price: 2}, {name: 'orange', price: 3}, {name: 'apple2', price: 1}]; arr1.sort((a, b) => { if (a.price b.price) { return 1; } else { if (a.name b.name) { return 1; } else { return 0; } } }); console.log(arr1); // [{name: 'apple', price: 1}, {name: 'apple2', price: 1}, {name: 'banana', price: 2}, {name: 'orange', price: 3}]
以上示例演示了如何實現穩定排序。當元素價格相等時,再比較元素名稱的大小。
四、jsarray.sort()的實現方法
jsarray.sort()是在ECMAScript標準中規定的。大多數現代瀏覽器使用的是快排演算法。
快排演算法的基本思想是選取一個基準值,將數組分成左右兩部分,左邊部分的所有元素都小於基準值,右邊部分的所有元素都大於基準值,然後遞歸地對左右兩部分進行排序。
function quickSort(arr) { if (arr.length <= 1) { return arr; } const pivotIndex = Math.floor(arr.length / 2); const pivot = arr[pivotIndex]; const left = []; const right = []; for (let i = 0; i < arr.length; i++) { if (i === pivotIndex) { continue; } if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return [...quickSort(left), pivot, ...quickSort(right)]; } const arr1 = [10, 5, 20]; console.log(quickSort(arr1)); // [5, 10, 20]
以上示例展示了快排演算法的實現方法。快排非常高效,但是在某些情況下會退化成O(n^2)的時間複雜度,例如原數組已經有序或者幾乎有序。
五、jsarray.sort()的時間複雜度
對於通用數組排序演算法,最壞時間複雜度是O(nlogn),平均時間複雜度也是O(nlogn)。但是具體實現排序演算法的時間複雜度和效率都有所不同。
jsarray.sort()的默認排序演算法是快排,時間複雜度為O(nlogn)。但是在某些情況下,例如原數組已經有序或者幾乎有序,快排會退化為O(n^2)的時間複雜度。
除了快排,Chrome瀏覽器還有另一種排序演算法TimSort。TimSort是由Tim Peters在2002年發明的,是一種穩定排序演算法,被用於Python、Java和C#等語言中的實現。TimSort演算法的時間複雜度為O(nlogn)。
六、總結
jsarray.sort()是Javascript中的一個重要方法,可用於對數組進行排序。比較函數是排序規則的決定因素,穩定排序尤為重要。jsarray.sort()默認使用快排演算法實現,快排演算法的時間複雜度為O(nlogn)。在某些情況下會退化為O(n^2)的時間複雜度。除了快排,Chrome瀏覽器還實現了TimSort演算法,TimSort演算法是一種穩定排序演算法,時間複雜度為O(nlogn)。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/206011.html