Java經典算法之選擇排序(Select Sort)

思路:就是把所有數據項掃描一遍,挑出最小的那個和最左邊的交換位置,即放到0位置。現在最左邊的就是有序得了,不需要在交換位置,再次掃描數據時就是從1開始,還是尋找最小的和1交換位置,直到所有數據都是有序的。選擇排序的比較次數與冒泡排序相同,都是N-1次(不懂爲什麼是N-1次的去看這篇文章https://blog.csdn.net/qq_43196107/article/details/86526739),但是交換次數少於冒泡排序,每趟排序只有最後一次交換,前面的比較都是下標賦值

下面舉例說明:

int[] arg = {6,3,8,2,9,1}

int min = 0

第一趟排序:

     第一次3和6比較,3小於6,min = 1

     第二次從min=1開始比較:8和3比較,8大於3,繼續不賦值

               第三次2和3比較,2小於3,min = 3

               第四次從min = 3開始比較,9大於2,繼續不賦值

               第五次1和2比較,1小於2,min = 5

               將下標0和下標5進行交換

    第一趟總共進行了 5次比較  1次交換, 排序結果:      1,3,8,2,9,6


第二趟排序(從3開始向後比較):

      第一次3和8比較,8大於3,繼續不賦值

             第二次2和3比較,2小於3,min = 3

              第三次從min = 3開始比較,9 大於2,繼續不賦值

              第四次從min = 3開始比較,6大於2,不賦值,循環結束

              將下標1和下標3進行交換

    第二趟總共進行了4次比較 1次交換, 排序結果:    1,2,8,3,9,6  


第三趟排序(從8開始向後比較):

     第一次3和8比較,3小於8,min = 3

             第二次從min = 3開始比較,9大於3,繼續不賦值

             第三次從min = 3開始比較,6大於4,繼續不賦值結束循環

             將下標2和下標3進行交換,

    第二趟總共進行了3次比較 1次交換, 排序結果:       1,2,3,8,9,6


第四趟排序(從8開始向後比較):

    第一次8和9比較,9大於8,繼續不賦值

              第二次8和6比較,6小於8,min = 5結束循環

              將下標3和下標5進行交換

    第二趟總共進行了2次比較 1次交換, 排序結果:        1,2,3,6,8,9


第五趟排序(從8開始向後比較):

      第一次8和9比較,9大於8,不賦值結束循環

    第二趟總共進行了1次比較 0次交換, 排序結果:  1,2,3,6,8,9 


 代碼實現:

外層循環用變量out,從數組開頭開始(數組下標爲0)向高位增長。內層循環用循環變量in,從out所指位置開始,同樣是向右移位,在每一個in的新位置數據項array[in]和array[min]進行比較,如果a[in]更小,則min被賦值爲in的值,在內層循環的最後,min被指向最小的值,然後交換out和min指向的數組數據項

 public static void selectSort(int[] array) {
        int out,in,min = 0;
        for (out = 0; out<array.length-1; out++) {
            min = out;
            for (in = out; in<array.length; in++) {
                if (array[in] < array[min]) {
                    min = in;
                }
            }
            swap(out, min);
        }
    }

public static void swap(int one, int two) {
        int temp = ii[one];
        ii[one] = ii[two];
        ii[two] = temp;
    }

不變性:下標小於或等於out位置的數據總是有序的

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