js氣泡排序及優化
阿新 • • 發佈:2019-02-11
氣泡排序的基本思想是對所有相鄰記錄的關鍵字值每一輪進行比效,如果(a[j]>a[j+1]),則將其交換,最終達到有序化。
它是穩定的排序
最壞情況:
**時間複雜度為O(n^2)**是把順序的排列變成逆序,或者把逆序的數列變成順序。在這種情況下,每一次比較都需要進行交換運算。
最好情況:
時間複雜度為O[n]。也就是排列前,表本身就是順序的,則根據改進後 的方法需要進行n-1次比較,沒有資料交換。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript"> function maopaoSort(arr) { for (let i = 0; i < arr.length - 1; i++) { for (let j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { // 相鄰元素兩兩對比 let temp = arr[j + 1]; // 元素交換 arr[j + 1] = arr[j]; arr[j] = temp; } } } return arr; } let arr=[2,5,7,3,9,4]; console.log(arr); console.log(maopaoSort(arr)); </script> </head> <body> </body> </html>
優化後的氣泡排序
在第一層for迴圈加入初始化一個exchange交換標誌為false,當有交換髮生時,則變為true,在第二層for迴圈結束後加入一個判斷,如果為false,即從前往後對比沒有交換,證明已經大小順序正確,即可break來跳出外層for迴圈。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript"> //需要排序的陣列 var arr = Array(23, 45, 18, 37, 92, 13, 24); var exchange;//交換標誌 for (var i = 0; i <arr.length - 1;i ++) { //最多做n-1趟排序 exchange = false; for (var j = arr.length - 1; j> i; j--) { if (arr[j] <arr[j - 1]) { exchange = true; var tmp = arr[j - 1]; arr[j - 1] = arr[j]; arr[j] = tmp; } } //若本趟排序未發生交換,提前終止演算法 if (!exchange) { break; } } alert('陣列排序後為:' + arr + ',n共排了' + i+ '趟'); </script> </head> <body> </body> </html>