手寫算法並記住它:冒泡排序

對於經典算法,你是否也遇到這樣的情形:學時以爲很清楚,可過陣子就忘了?javascript

本系列文章就嘗試解決這個問題。java

研讀那些排序算法,細品它們的名字,其實都很貼切。算法

好比冒泡排序就很形象,遍歷n次,每次循環相鄰元素兩兩比較,把其中大的元素日後放。例如:markdown

上圖演示了冒泡過程的第一次循環。其中,最大的元素5就像氣泡同樣逐步上升到最後一位。函數

咱們把上述過程直接翻譯成代碼:oop

let array = [5, 4, 3, 2, 1]
for (let i = 0; i < array.length - 1; i++) {
  if (array[i] > array[i+1]) {
    swap(array, i, i+1)
  }
}
console.log(array) // [4, 3, 2, 1, 5]
複製代碼

其中swap函數封裝了兩個元素如何交換:優化

function swap(array, i, j) {
  [array[i], array[j]] = [array[j], array[i]]
}
複製代碼

第一次遍歷會把最大的元素放到倒數第一個位置上,第二次遍歷會把第2大的元素放倒數第二個位置上。spa

其他次數,以此類推。此時,咱們也很容易把這n次遍歷寫出來:翻譯

for (let j = 0; j < array.length; j++) {
  for (let i = 0; i < array.length - 1; i++) {
    if (array[i] > array[i+1]) {
      swap(array, i, i+1)
    }
  }
}
複製代碼

上述代碼,還有優化的空間,好比第2次遍歷時,元素4和5實際上是不須要再比較的。由於上一次已經把未排好序中最大的數據挑走了。查看完整代碼:codepencode

至此,冒泡排序原理和實現已經說完了。

這裏總結一下,冒泡排序不須要額外空間,是本地排序,相等元素是不會交換先後順序,於是也是穩定排序,時間複雜度爲O(n^2),適用於少許數據排序,但實際中用得很少。

冒泡排序,要作到能分分鐘手寫出來,是須要掌握其排序原理的。每次遍歷核心是相鄰兩兩比較,一旦內層遍歷能寫出來,那麼總體就很容易寫出來,不須要死記硬背的。

但願有所幫助,本文完。

相關文章
相關標籤/搜索