1.冒泡排序
原理:
相鄰的兩個單位,比較存儲的數據。如果第一個單元的數據較大,就將兩個相鄰單元交換存儲數據。
過程:
從起始單元開始比較,第一次循環,會選擇出一個最大值,放在數組所有單元的最后;
之后,每次循環,都會比較出一個本次循環的最大值,放在當前參與比較單元的最后;
之前已經比較選出的單元,不會參與下一次比較。
優化:
(1) 最后一個單元已經通過倒數第二個單元參與比較了,因此最后一個單元就不用參與單次循環了。
(2)之前比較出的最大值,不再參與下一次的比較
(3)n個單元只要循環比較n-1次就可以, 最后就一個單元時不用再循環比較。
核心:
交換存儲的數據,兩個相鄰的單元比較數據大小,第一個單元數值較大就交換兩個單元存儲的數據。
var arr = [30, 33, 13, 2, 1];
for (j = 0; j <= (arr.length - 1) - 1; j++) {
for (var i = 0; i <= (arr.length - 1) - 1 - j; i++) {
if (arr[i] > arr[i + 1]) {
var middle = 0;
middle = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = middle;
}
}
}
console.log(arr);
2. 選擇排序
步驟:
(1)先定義循環的起始位置默認為最小值所在位置,從起始位置下一個位置開始執行循環。
(2)如果有位置上的數值小於存儲索引位置上的數值,就存儲這個位置的索引值。
(3)循環結束后比較存儲的索引是否是起始位置索引,如果不是就交換兩個位置上的數值,會將本次循環的最小值,放置在循環的起始位置上。
(4)再執行多次循環完成排序。
核心 :
找到最小值的索引,再與起始位置交換數值。
優化 :
(1)之前比較的數值不參與一次標記
(2)2 n個單元,只要比較n-1次
var arr = [5, 4, 3, 2, 1];
//外層循環,最后剩下的那個數已經是最大的了因此就不用參與循環了,循環的次數要-1
for (j = 0; j <= (arr.length - 1) - 1; j++) {
//我們默認起始位置是最小值
var min = j;
//默認起始位置是最小值,比較的時候只需要從下一個開始比較就可以了
for (i = j + 1; i <= arr.length - 1; i++) {
//讓min存儲最小值的數組下標
if (arr[min] > arr[i]) {
min = i;
}
}
//如果這個數組下標不是起始的數組下標
//就交換min中存儲的索引下標對應的數值 和 j索引下標應的數值
if (min != j) {
var middle = 0;
middle = arr[j];
arr[j] = arr[min];
arr[min] = middle;
}
}
console.log(arr);
總結:
選擇排序: (效率高)
如果發生大小順序問題,只是做賦值索引的操作。等循環完成,執行判斷,做一次數據交換。
冒泡排序:
每次發生大小順序問題,都要執行數據交換操作。執行數據交換的次數高於選擇排序,執行數據交換的操作比較繁瑣,執行次數過多,執行效率低。
