簡介
冒泡排序,將臨近的數字兩兩比較,按照大小順序進行位置交換。
- 第一趟排序后,最大的數字(從小到大排序)或最小的數字(從大到小排序)被交換到最后一位,也就是說最后一位被確定;
- 第二趟確定倒數第二位數字;
- 以此類推,第三趟確定倒數第三位數字,第四趟確定倒數第4位數字,第五趟...
講解
設示例數組為:[5,2,7,1,4,9,8],小->大排序;
- 第一趟排序
第一次:[5,2,7,1,4,9,8]中5與2比較,5>2所以交換位置,數組變作為-->[2,5,7,1,4,9,8];
第二次:[2,5,7,1,4,9,8]中5與7比較,5<7所以不交換位置,數組變作為-->[2,5,7,1,4,9,8];
第三次:[2,5,7,1,4,9,8]中7與1比較,7>1所以交換位置,數組變作為-->[2,5,1,7,4,9,8];
第四次:[2,5,1,7,4,9,8]中7與4比較,7>4所以交換位置,數組變作為-->[2,5,1,4,7,9,8];
第五次:[2,5,1,4,7,9,8]中7與9比較,7<9所以不交換位置,數組變作為-->[2,5,1,4,7,9,8];
第六次:[2,5,1,4,7,9,8]中9與8比較,9>8所以交換位置,數組變作為-->[2,5,1,4,7,8,9];此時最大的數字9已經到了末尾。
第二趟排序
第一次:[2,5,1,4,7,8,9]中2與5比較,2<5所以不交換位置,數組變作為-->[2,5,1,4,7,8,9];
第二次:[2,5,1,4,7,8,9]中5與1比較,5>1所以交換位置,數組變作為-->[2,1,5,4,7,8,9];
第三次:[2,1,4,5,7,8,9];
第四次:[2,1,4,5,7,8,9];
第五次:[2,1,4,5,7,8,9];這里不需要第六次比較,因為最后一個數已知是最大的,不需要再進行比較。同理第三趟不需要第五次比較,第四趟不需要第四次比較...
之后演示已無必要,喲喲切克鬧,咳咳...
我們可以發現,該算法的復雜度為:(n-1)+(n-2)+...+2+1=n(n-1)/2
演示代碼
//從小到大排序
function bubbleSort(array){
var tem = 0;
for (var i = 0; i < array.length; i++) {
for (var j = 0; j < array.length-i; j++) {
if(array[j]>array[j+1]){
tem = array[j];
array[j] = array[j+1];
array[j+1] = tem;
}
}
}
}
window.onload=function(){
var array = [2,3,1,4,9,7,5];
bubbleSort(array);
console.log(array);
}
補充一:最近聽見很多同學在說冒泡排序的復雜度為n的平方,百度一看似乎蠻多人也是這樣認為的,看到的同學難免會有些為難究竟哪一個復雜度是正確的。
事實上,兩者都是正確的,n(n-1)/2是比較精確,而n^2則是表示該算法復雜度的數量級。
n(n-1)/2 --->
(n^2-n)/2 --->
當n足夠大時,-n的影響很小,而為了表示數量級n^2的系數1/2也去掉 --->
那么現在復雜度就是n^2了