JS排序算法——冒泡排序


排序算法優劣說明:

穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面;

不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;

內排序:所有排序操作都在內存中完成;

外排序:由於數據太大,因此把數據放在磁盤中,而排序通過磁盤和內存的數據傳輸才能進行;

事件複雜度:一個算法執行所耗費的事件;

空間複雜度:運行完一個程序所需內存的大小;

排序算法圖片總結:



圖片引用自 :    js十大排序算法


冒泡排序原理:

依次比較相鄰的兩個值,如果後面的比前面的小,則將小的元素排到前面,依照這個規則進行多次並且遞減的迭代,直到排序順序正確爲止。

舉例說明:

現在有一個數組爲[2,5,3,1,4]

①排序開始,對比第一項和第二項,由於順序是正確的,無需交換;

②對比第二項和第三項,由於5大於3,所以交換位置,3排到前面,結果是[2,3,5,1,4];

③對比第三項和第四項,由於5大於1,所以交換位置,1排到5前面,結果是[2,3,1,5,4];

④再次循環第二項和第三項,3大於1,交換位置,結果是[2,1,3,5,4];

⑤第一項和第二項交換,爲[1,2,3,5,4],第四項和第五項交換爲[1,2,3,4,5]。

冒泡排序:

冒泡排序的第一步其實就是寫一個方法,用於交換數組裏面需要交換位置的兩個元素:

function exchangeNum (items, frontIndex, behindIndex) {
  var temp = items[frontIndex]
  items[frontIndex] = items[behindIndex]
  items[behindIndex] = temp
}

正向冒泡排序:

let arr = [89, 99, 10, 3, 15, 1, 45, 78, 32, 9, 18]
// 外層循環控制的是循環遍歷的次數,內層循環是遍歷數組
// 因爲需要兩兩比較大小,所以5個元素只需比較4次,arr.length個元素則比較arr.length-1次
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]) {
      exchangeNum(arr, j, j + 1)
    }
  }
}
console.log(arr) // 輸出:[1, 3, 9, 10, 15, 18, 32, 45, 78, 89, 99]

反向冒泡排序:

let arr = [89, 99, 10, 3, 15, 1, 45, 78, 32, 9, 18]
for (let i = arr.length - 1; i >= 0; i--) {
  for (let j = arr.length - i - 1; j >= 0; j--) {
    if (arr[j] < arr[j - 1]) {
      exchangeNum(arr, j, j - 1)
    }
  }
}
console.log(arr) // 輸出:[1, 3, 9, 10, 15, 18, 32, 45, 78, 89, 99]

js的冒泡排序算法可能在實際工作中並沒有什麼應用,實際工作中用的最多的是Array.prototype.sort(),因爲相較於冒泡排序,他擁有更高的效率。但是面試的時候問冒泡排序原理的很多,可能他更像一個工具,可以幫我們更好的瞭解算法。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章