JS排序--氣泡排序(實現及優化)
阿新 • • 發佈:2020-12-19
首先我們用JS實現氣泡排序的話,最常見的應該是這種。
基礎版:
<script>
function sort(arr) {
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);
}
return arr;
}
let arr = [9, 8, 7, 6, 5, 4, 3, 2, 1];
sort(arr);
由於是最常見的排序方法,所以不說實現過程了。
優化一:
現在我們來看一組數:
let arr = [1, 2, 3, 4, 5, 6, 7, 9, 8];
其實在這個排序中,第一趟排序已經完成排序了,但是他還要繼續之後的7趟。
也就是說後面的7趟都是做的無用功。
那我們可不可以用一個flag來判斷,如果排序已經完成,那麼我就不進行後面的無用排序了。
<script>
//第一種優化
function sort(arr) {
for (var i = 0; i < arr.length - 1; i++) {
var flag = 0;
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;
flag = 1;
}
}
//如果不交換元素,說明已經排序完成,可以跳出迴圈了。
if (flag == 0) {
break;
}
console.log('第一趟->' + arr);
}
}
let arr = [1, 2, 3, 4, 5, 6, 7, 9, 8];
sort(arr);
</script>
我們可以看一下列印結果:
也就是說外層迴圈只執行了一次。
不會執行後面的7次無用迴圈。
優化二:
現在我們再看另一組數
let arr = [6, 5, 4, 3, 2, 1, 7, 8, 9]
在這裡面我們進行冒泡的時候,會發現後面的789並沒有動。
那我們你可以記錄7這個位置,每次冒泡到7這個位置就不繼續下去,也會少了一些操作。
<script>
//第二種優化
function sort(arr) {
for (var i = 0; i < arr.length - 1; i++) {
var k = arr.length - i - 1;
//pos有兩個功能,第一個功能是優化1中的功能,第二個是記錄最後交換的位置,下次交換到這個位置就可以了。
var pos = -1;
for (var j = 0; j < k; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
pos = j;
}
}
k = pos;
if (pos == -1) {
break;
}
console.log(arr);
}
}
let arr = [6, 5, 4, 3, 2, 1, 7, 8, 9];
sort(arr);
</script>
OK,這就是冒泡的兩個優化。