1. 程式人生 > >選擇排序法

選擇排序法

最好 tps 程序設計 重復執行 void lec 冒泡 需要 挑戰程序設計競賽

選擇排序法會在每一步中選出一個最小值,進而完成排序。與插入排序法和冒泡排序法一樣,選擇排序法的各個計算步驟中,數組也分成“已排序部分”和“未排序部分”。

具體流程:

  • 重復執行 n-1(數組長度為n)次下述操作
  1. 找出未排序部分最小值的位置min(數組中的索引)。
  2. 將min位置的元素與未排序部分的起始元素交換。

以數組{5, 4, 8, 7, 9, 3, 1}為例使用選擇排序法,流程如下圖所示:
技術分享圖片

參考代碼如下:

    public static void selectionSort(int[] num){
        if (num==null)
            return;

        //每次選擇一個未排序數組中最小的放在開始處,一共需要n-1次
        for (int i=0; i<num.length-1; i++){
            int min = i; //將每次遍歷開始的索引保存為min,之後min保存當前遍歷中數值最小的索引。
            for (int j=i+1; j<num.length; j++){
                if (num[j] < num[min]){
                    min = j;
                }
            }

            //如果min不等於i,將最小的數值調換到i位置上
            if (i != min){
                int temp = num[i];
                num[i] = num[min];
                num[min] = temp;
            }
        }
    }

選擇排序法算法不穩定;時間復雜度最好情況,最壞情況和平均情況的時間復雜度都是\(O(n^2)\);空間復雜度為\(O(1)\)

參考文獻:《挑戰程序設計競賽-算法和數據結構》

選擇排序法