js冒泡排序
冒泡排序:指的是對一個數值數組進行從小到大的排序操作。
數組元素總個數為arr.length
- 輪數為arr.length - 1
- 每輪的比較次數不同:呈現依次遞減的形式
關于冒泡排序的作用:友善數組資料的排序。
例如:使用數組進行數字的排序
var arr = [1, 2, 4, 3];
var count = 0;
// 設定一個循環用于控制比較的輪數
for (var i = 0; i < arr.length - 1; i++) {
count++;
// 設定内層循環用于控制每輪中的比較次數
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, count);
小結:
- 這樣雖然可以周遊出,數組的大小,但一直執行下去,會多出一些不必要的循環,
- 下面例子會改進一下,提高效率。
如何改進呢?
問題:任意的數組進行排序時,根據設定都需要進行length - 1輪的比較操作
- 有時候可能并不需要進行所有輪的比較,就可以排序完畢
- 如果可以在排序完畢的時候就進行結束,可以優化一些性能
方式:
- 需要檢測排序過程中,哪一輪可以确定排序完畢了
- 如果某一輪的所有次比較時都沒有進行交換操作(沒進入if),說明排序完畢
- 我們需要知道某一輪是否進入過if,等比較執行完畢,确定一下進入if的情況即可
var arr = [1, 2, 4, 3, 5, 6, 7, 8, 9];
var count = 0;
// 設定一個循環用于控制比較的輪數
for (var i = 0; i < arr.length - 1; i++) {
count++;
// 設定一個變量用于标記,true表示沒有進入過if的狀态,false代表了進入過if
var bool = true;
// 設定内層循環用于控制每輪中的比較次數
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;
bool = false;
}
}
// 必須在目前輪所有比較都執行完畢後,再判斷if的進入情況(書寫在内層for後面)
if (bool) {
// 隻有bool為true的時候才能進入内部執行代碼
break; // 結束循環執行
}
}
console.log(arr, count);
思考:
上面的改進中通過變量控制操作判斷了if的進入狀态
- 使用的注意點:
- 變量叫什麼名字和儲存什麼值都無所謂,通常名稱為bool或flag,值通常為布爾類型
- 設定時必須明确每個值代表的含義。