1. 程式人生 > >js氣泡排序及優化

js氣泡排序及優化

氣泡排序的基本思想是對所有相鄰記錄的關鍵字值每一輪進行比效,如果(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>

在這裡插入圖片描述