冒泡排序算法步驟:
- 比較相鄰的元素秸应。如果第一個(gè)比第二個(gè)大橘霎,就交換他們兩個(gè)蔫浆。
- 對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)姐叁。這步做完后瓦盛,最后的元素會(huì)是最大的數(shù)。
- 針對(duì)所有的元素重復(fù)以上的步驟外潜,除了最后一個(gè)原环。
- 持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較处窥。
以下面5個(gè)無序的數(shù)據(jù)為例:
40 8 15 18 12 (文中僅細(xì)化了第一趟的比較過程)
第1趟: 8 15 18 12 40
第一趟對(duì)比過程.png
第2趟: 8 15 12 18 40
第3趟: 8 12 15 18 40
第4趟: 8 12 15 18 40
let arr = [40, 8, 15, 18, 12];
function bubbleSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
console.log('排序前:'+arr);
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
console.log('排序中!!調(diào)整:'+arr);
}else{
console.log('排序中!!不調(diào)整:'+arr);
}
}
console.log('排序后:'+arr);
console.log('-------------------');
}
console.log('最終結(jié)果:'+arr);
return arr;
}
bubbleSort(arr);
最佳情況:T(n) = O(n)
當(dāng)輸入的數(shù)據(jù)已經(jīng)是正序時(shí)(都已經(jīng)是正序了嘱吗,何必還排序呢….)
最差情況:T(n) = O(n2)
當(dāng)輸入的數(shù)據(jù)是反序時(shí)(哦天,我直接反序不就完了….)
平均情況:T(n) = O(n2)
平均時(shí)間復(fù)雜度:O(n2)
空間復(fù)雜度:O(1) (用于交換)
穩(wěn)定性:穩(wěn)定
沉底的操作 一次遍歷會(huì)將最大的值找到放在最后一位 第二次找到第二大
排序前:40,8,15,18,12
排序中!!調(diào)整:8,40,15,18,12
排序中!!調(diào)整:8,15,40,18,12
排序中!!調(diào)整:8,15,18,40,12
排序中!!調(diào)整:8,15,18,12,40
排序后:8,15,18,12,40 //第一次遍歷結(jié)束找到最大40
-------------------
排序前:8,15,18,12,40
排序中!!不調(diào)整:8,15,18,12,40
排序中!!不調(diào)整:8,15,18,12,40
排序中!!調(diào)整:8,15,12,18,40
排序后:8,15,12,18,40 //第二次遍歷結(jié)束找到次大18
-------------------
排序前:8,15,12,18,40
排序中!!不調(diào)整:8,15,12,18,40
排序中!!調(diào)整:8,12,15,18,40
排序后:8,12,15,18,40 //第三次遍歷結(jié)束找到次次大15
-------------------
排序前:8,12,15,18,40
排序中!!不調(diào)整:8,12,15,18,40
排序后:8,12,15,18,40
-------------------
最終結(jié)果:8,12,15,18,40
為什么內(nèi)部循環(huán)是arr.length - i - 1
因?yàn)榍耙淮窝h(huán)會(huì)找到最大值,所以每次循環(huán)都可以減少最后幾項(xiàng)的對(duì)比谒麦。
image.png