1. 原理
對數組進行遍歷,每次對相鄰的兩個元素進行比較,如果大的在前面,則交換兩個元素的位置,完成一趟遍歷后,數組中最大的數值到了數組的末尾。再對前面n-1個數值進行相同的遍歷。一共完成n-1趟遍歷就實現了排序。
?
1. 進行第一趟遍歷:?
?
從上圖中可以看出 一共比較了5次, 也就是 n-1 次
下面的每趟和第一趟的算法流程相同:
第二趟:2,3,5,1,7,10? ? --->? 比較了4次? ?(n-2)
第三趟:2,3,1,5,7,10? ??--->? 比較了3次? ?(n-3)
第四趟:2,1,3,5,7,10? ? --->? 比較了2次? ?(n-4)
第五趟:1,2,3,5,7,10? ? --->? 比較了1次? ?(n-5)
總共經過5趟,完成排序
2. 代碼實現
這邊需要兩個for循環, 外層for循環控制共經過多少趟, 內層for循環控制每一趟比較的次數
for (let i = 0; i < arr.length-1; i++) {for(let j = 0; j < arr.length-i-1; j++) {if (arr[j] > arr[j+1]) {let t = arr[j]arr[j] = arr[j+1]arr[j+1] = t}}}
3. 代碼優化
如果一趟走完,沒有數據進行交換,說明已經排好序了,不需要進行遍歷了,則可以引入標記flag.
for (let i = 0; i < arr.length-1; i++) {let flag = 0 for(let j = 0; j < arr.length-i-1; j++) {if (arr[j] > arr[j+1]) {let t = arr[j]arr[j] = arr[j+1]arr[j+1] = tflag = 1 //發生數據交換,置flag為1}}if (flag == 0) { //若flag為0,則沒有發生交換,跳出循環break}}
4. 復雜度分析
1. 時間復雜度:找出執行次數最多的語句即可
if (arr[j] > arr[j+1]) {}
即這個if 判斷語句執行的次數最多
基于上述每一趟比較的次數,可以得到總的比較次數,就是這個判斷語句執行的次數
=>? (n-1)+(n-2)+(n-3)+...+1 = [n(n-1)]/2? = n^2/2 - n/2 + 1/2
=> 去掉系數、低階和常量??
=> 則時間復雜度為? O(n^2)
2. 空間復雜度: 冒泡排序中并沒有用到額外的空間,所以空間復雜度為 O(1)
3. 冒泡排序是穩定的排序算法:因為當兩個元素相同的話,是不會交換位置的?