選擇排序是一個穩定排序算法嗎?

選擇排序

選擇排序是一種簡單直觀的排序算法,無論什麼數據都是O(n^2)的時間複雜度。所以用到它的時候,數據規模越小越好。

算法步驟

  1. 從數組中找出最小的那個元素,然後與最開始的元素交換位置
  2. 忽略第一步中找到的最小元素,重複執行步驟1

動圖演示

選擇排序

算法實現

for (int i = 0; i < array.length - 1; i++) {
    int minIndex = i; // 保存最小元素索引
    for (int j = i; j < array.length; j++) {
        if(cmp(minIndex, j) > 0) {
            minIndex = j;
        }
    }
    swap(i, minIndex); // 將最小元素交換到開始位置
}

也可以挑選出最大元素,與最後的元素的交換,實現代碼如下:

for (int end = array.length - 1; end > 0; end--) {

    int maxIndex = 0; // 記錄最大索引
    for (int begin = 1; begin <= end; begin++) {
        if (cmp(maxIndex, begin) <= 0) {
            maxIndex = begin;
        }
    }
    swap(maxIndex, end); // 將最大元素交換到最後位置
}

選擇排序的交換次數要遠遠少於冒泡排序,平均性能優於冒泡排序。

最好、最壞、平均時間複雜度:O(n^2)。

空間複雜度:O(1)。

選擇排序是一個不穩定的排序算法,看下面的例子:

  • 排序前:5* 5 1 7
  • 排序後:1 5 5* 7

算法優化

選擇排序每次循環中都需要找出最小(大)的元素與開始(最後)位置的元素進行交換,可以使用大頂堆來實現查找最大元素,可以將查找元素的時間複雜度由O(n)降低爲O(logn),其實就是堆排序。

更多精彩內容關注本人公衆號:架構師升級之路
公衆號

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