【算法】——選擇排序,實例分析選擇排序算法

選擇排序,將一個序列看做兩個部分,前面有序,後面無序,每次在後面的無序序列中,選擇一個最小的元素,交換到前面有序序列的末尾,直到無序序列全部完成交換,即可完成排序

選擇排序是不穩定的排序算法

如何判斷一個排序算法是否穩定

  • 如果一個待排序列中有多個相同的元素,經過排序後,它們的次序保持不變,則稱這種排序算法是穩定的
  • (即假如有元素A = 5,B = 5,且 A 在 B 的前面,經過排序後,A 還在 B 的前面,則稱這種排序算法是穩定的)

基本思想:

  • 第一次:從待排序的序列中選出最小的一個元素,存放在序列的起始位置
  • 第二次:再從剩餘的未排序元素中尋找到最小元素,放到已排序的序列的末尾
  • 以此類推,直到全部待排序的數據元素的個數爲零。

舉例分析:

有一個序列(5, 2, 0, 1, 3, 1, 4)

第一趟排序:

  • 先選擇 5 爲最小的元素 min = 5
  • 然後將它後面元素依次和最小元素min進行比較
  • 2比 min 小,令 min = 2
  • 0比 min 小,令 min = 0
  • 1比 min 大,不處理
  • 3比 min 大,不處理
  • 1比 min 大,不處理
  • 4比 min 大,不處理
  • 此時的最小元素爲 min = 0
  • 所以將它和 5 進行交換(0, 2, 5, 1, 3, 1, 4)

第二趟排序:

  • 先選擇 2 爲最小的元素 min = 2
  • 然後將它後面元素依次和最小元素min進行比較
  • 5比 min 大,不處理
  • 1比 min 小,令 min = 1
  • 3比 min 大,不處理
  • 1不比 min 小,不處理
  • 4比 min 大,不處理
  • 此時最小元素 min = 1 
  • 所以將它和 2 進行交換(0, 1, 5, 2, 3, 1, 4)

此時我們看到,經過兩趟排序,前面兩個元素 0, 1 已經是有序的了

所以我們只需重複執行上面的操作,直到後面元素都比較完爲止,即可完成排序

總的來說,就是每次在後面的無序序列中,選擇一個最小的元素,交換到前面有序序列的末尾,直到無序序列全部完成交換

動圖演示

Java代碼

package algorithm;

public class Sort {

    // 選擇排序算法
    public static void selectSort(int[] array) {
        for (int i = 0 ; i < array.length - 1 ; i++) {
            // 先令最小的元素的下標 等於 當前元素的下標
            int minIndex = i;
            // 然後尋找比當前元素還小的元素的下標
            for (int j = i ; j < array.length ; j++) {
                if (array[j] < array[minIndex]) {
                    minIndex = j;
                }
            }
            // 找到之後,進行交換
            // 如果沒找到,則當前就是最小的,不用交換
            if (minIndex != i) {
                int temp = array[i];
                array[i] = array[minIndex];
                array[minIndex] = temp;
            }
        }
    }

    public static void main(String[] args) {
        int[] array = new int[]{5, 2, 0, 1, 3, 1, 4};
        Sort.selectSort(array);
        // 打印數組
        for (int i = 0 ; i < array.length ; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

時間複雜度

  • 最好情況:O(n²),序列有序,無需進行交換,但仍需全部進行比較
  • 平均情況:O(n²)
  • 最壞情況:O(n²),序列逆序,需要全部進行比較,然後進行交換
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章