氣泡排序的實現,複雜度以及改進
阿新 • • 發佈:2022-05-08
時間複雜度: O(n^2)
一般的冒泡:
function bubbleSort1(arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
}
}
}
}
這個存在的問題是,每次迴圈一次,後面就會多一段有序的陣列,然而每次還是遍歷了,是多餘了
優化一下這個問題
function bubbleSort2(arr) {
// i是j需要遍歷的次數,並不用i來遍歷內容。
// 這樣,每次會把上一次排過的陣列濾過,只排列前面還沒有排列的部分
// 每一次j就可以少遍歷一次
for (let i = arr.length-1; i >= 0; i--) {
for (let j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
}
}
}
}
對於這個方案,還可以改進
如果剩下的還沒有排序的部分,本身就是有序的,也可以讓遍歷跳過,就又可以省下不少時間
例如這種: let a = [1, 2, 3, 4, 5, 6, 3, 11, 12, 9, 5, 8, 7, 23, 6, 8, 9];
function bubbleSort3(arr) {
var swapedFlag;
for (var i = arr.length - 1; i >= 0; i--) {
swapedFlag = false;
for (var j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
swapedFlag = true;
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
}
}
// 如果j遍歷,從頭到尾都沒有把swapedFlag置為true,就證明剩下的一段陣列,本來就是按順序的,就不用再遍歷了
if (!swapedFlag) {
break;
}
}
}