算法學習:選擇排序

前言

自從算法課結課後就不多系統地學習、總結算法相關的知識了,因此但願以文章記錄算法,進行總結。所記錄的算法均學習自《算法(第4版)》,此書代碼採用Java編寫,本人使用js復現。算法

選擇排序思想

選擇排序的思想很是簡單:數組

首先,找到數組中最小的那個元素,其次,將它和數組的第一個元素交換位置(若是第一個元素就是最小元素那麼它就和本身交換)。再次,在剩下的元素中找到最小的元素,將它與數組的第二個元素交換位置。如此往復,直到將整個數組排序。這種方法叫作選擇排序,由於它在不斷地選擇剩餘元素之中的最小者。
——《算法(第四版)》less


此算法的實現很是簡單,通俗地說就是一共遍歷n( n = array.length )趟,第i趟( 0 < i < array.length )在剩餘的元素(array[i + 1] ~ array[length - 1])中找出最小值元素,交換至array[i]——每一趟都是一次選擇最小值,而後交換,直至遍歷完成
圖例:

核心代碼

此算法的實現很是簡單,如下爲排序的核心代碼學習

sort(array) {
  for (let i = 0; i < array.length; i++) {
    //遍歷元素下標
    let minIndex = i;
    let j = i + 1;
    for (; j < array.length; j++) {
      //尋找最小值
      if (this.less(array[j], array[minIndex])) {
        minIndex = j;
      }
    }
    this.exch(array, i, minIndex);
  }
}
複製代碼

所有代碼於CodePen之中:
CodePen打開this

選擇排序特色

選擇排序很是簡單,咱們也能夠發現有兩個特色:spa

  • 運行時間和輸入無關
  • 數據移動是最少的

運行時間和輸入無關

爲了找出最小的元素而掃描一遍數組並不能爲下一遍掃描提供什麼信息 ——《算法(第四版)》code

不管數據的初始狀態如何,選擇排序都會將全部元素進行遍歷。所以,不管輸入數據是排序好的數組仍是隨機數組,其運行時間都是相同的。此算法不善於利用輸入的初始狀態cdn

數據移動是最少的

每次交換都會改變兩個數組元素的值,所以選擇排序用了N次交換——交換次數和數組大小是線性關係。 ——《算法(第四版)》blog

結語

選擇排序很是簡單。沒撒好說。🤖排序

參考資料

《算法(第四版)》

相關文章
相關標籤/搜索