天天看點

還不懂JS數組排序?看懂這篇就夠了(附代碼)

作者:尚矽谷教育

相信大家對數組排序都不陌生,在開發中我們通常會使用sort方法進行數組的排序。今天我主要帶大家回顧一下JS中幾種常用的數組排序方式。

1. sort方法

基本思路:

sort方法預設按照字元的ASCII碼進行升序排序。可以傳一個函數作為參數并傳回一個數值實作升序或降序排列。

代碼實作:

var arr = [18, 2, 10, 9, 88, 66, 22];

arr.sort(function (a, b) {

return b - a; //降序排序

// return a - b; //升序排序

});

console.log(arr); //[88,66,22,18,10,9,2]

還不懂JS數組排序?看懂這篇就夠了(附代碼)

圖檔源于網絡,侵删

2. reverse方法

基本思路:

reverse同樣是數組中的排序方法,直接調用即可。不過它隻能實作數組的逆序排序,并且會直接在原數組上進行修改。

代碼實作:

var arr = [18, 2, 10, 9, 88, 66, 22];

arr.reverse();

console.log(arr); //[22,66,88,9,10,2,18]

3. 冒泡排序

基本思路:

冒泡排序可以說是數組排序最經典的排序方式。它的原理是指定一個規則,每次比較相鄰的兩個數,如果不符合規則就互換位置,這樣每一輪比較就能把最大或者最小的值放在數組最後一位,然後繼續對未排序的數組重新進行規則比較。

代碼實作:

var arr = [18, 2, 10, 9, 88, 66, 22];

for (var i = 0; i < arr.length - 1; i++) {

for (var j = 0; j < arr.length - i - 1; j++) {

if (arr[j] > arr[j + 1]) {

var temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

}

}

}

console.log(arr); // [2, 9, 10, 18, 22, 66, 88]

4. 選擇排序

基本思路:

先假設數組中的第一個元素為最小值,對應一個變量minIndex指向它的下标,然後讓該值和剩餘的所有值進行比較,如果小于該值,則将minIndex指向較小的值的下标,然後讓minIndex對應的值和剩餘的值進行比較,重複此操作至本輪循環結束,進而确定了目前最小值的下标。然後讓minIndex對應的值和數組第一個未排序的元素進行交換,這樣就确定了一個最小值,之後開始第二輪循環,忽略已排序的元素,假設第二個值為最小值,再次進行上述操作,以此類推,最終實作數組從小到大的排序。

代碼實作:

var arr = [18, 2, 10, 9, 88, 66, 22];

for (var i = 0; i < arr.length - 1; i++) {

var minIndex = i;

for (var j = i + 1; j < arr.length; j++) {

if (arr[minIndex] > arr[j]) {

minIndex = j;

}

}

var temp = arr[i];

arr[i] = arr[minIndex];

arr[minIndex] = temp;

}

console.log(arr); // [2, 9, 10, 18, 22, 66, 88]

5. 插入排序

基本思路:

插入排序是将數組第一個元素看做一個有序隊列,把剩下的元素當成是未排序隊列。從頭到尾依次掃描未排序序列,把每個元素在已經排序的元素隊列中從後向前依次比較,如果已排序元素大于新元素,則繼續比較,直到找到小于或等于新元素的已排序元素,然後将新元素插入到該元素後面。

代碼實作:

var arr = [18, 2, 10, 9, 88, 66, 22];

for (var i = 0; i < arr.length; i++) {

for (var j = i; j >= 0; j--) {

if (arr[j] > arr[j + 1]) {

var temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

}

}

}

console.log(arr); // [2, 9, 10, 18, 22, 66, 88]

6. 快速排序

基本思路:

快速排序是對冒牌排序的一種改進,它需要先取出數組的中間值作為基數,再準備兩個新的數組,把原數組中剩餘的值一一和它進行比較,小于它的放在左邊數組,大于它的放在右邊數組,然後左右兩個數組再次重複上述操作,最後再把所有的數組進行合并就會獲得完成排序後的新數組。

代碼實作:

var arr = [18, 2, 10, 9, 2, 9, 88, 66, 22];

var quickSort = function (arr) {

if (arr.length <= 1) {

return arr;

}

var midIndex = Math.floor(arr.length / 2);

var mid = arr[midIndex];

arr.splice(midIndex, 1);

var leftArr = [];

var rightArr = [];

for (var i = 0; i < arr.length; i++) {

if (arr[i] < mid) {

leftArr.push(arr[i]);

} else {

rightArr.push(arr[i]);

}

}

return quickSort(leftArr).concat([mid], quickSort(rightArr));

};

console.log(quickSort(arr)); // [2, 2, 9, 9, 10, 18, 22, 66, 88]