天天看點

排序之簡單選擇排序

前言

  本篇部落格是在伍迷兄的部落格基礎上進行的,其部落格位址點選就可以進去,裡面好部落格很多,我的排序算法都來自于此;一些資料結構方面的概念我就不多闡述了,伍迷兄的部落格中都有詳細講解,而我寫這些部落格隻是記錄自己學習過程,加入了一些自己的了解,同時也希望給别人提供幫助。

基本思想

  選擇排序的基本思想是每一趟在n-i+1(i=1,2,…,n-1)個記錄中選取關鍵字最小的記錄作為有序序列的第i個記錄。我們這裡先介紹的是簡單選擇排序法。簡單選擇排序法(Simple Selection Sort)就是通過n-i次關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,并和第i(1≤i≤n)個記錄交換之,就是說一剛開始,從序列arr[0...n-1]選出最小的元素與第1個記錄即arr[0]交換,再從arr[1...n-1]中選出最小的與arr[1]進行交換,arr[2...n-1]中最小的與arr[2]進行交換,以此類推,直至整個序列有序。

代碼實作

  /**
     * 簡單選擇排序
     * @param arr
     */
    public static void simpleSelectSort(int[] arr){
        int len = arr.length;
        int index;                                // 記錄arr[i...len-1]最小元素的下标
        for(int i=0; i<len; i++){
            index = i;
            for(int j=i+1; j<len; j++){            // 尋找arr[j...len-1]中最小元素
                if(arr[index] > arr[j]){
                    index = j;
                }
            }
            swap(arr,i,index);                    // 交換arr[i]和arr[index]
        }
    }      

執行過程模拟

  上面的代碼應該是很容易了解的,不過我們還是來模拟一下計算機執行的過程。

  1)一開始,初始序列是{5,3,7,9,1,6,4,8,2},i=0,index=i=0,j=i+1=1,初始時,狀态如下

  2)i=0時

  3)i=1時,同理,交換如下

  4)i=2,3,4,5,6,7,8時,如下

  至此,整個序列已經從小到大有序了;當然,從上面的模拟過程可以看出來,算法是可以些許改善的,改善的事就交給各位看官了,就當是拓展!

總結

  簡單排序算法還是比較簡單的,沒什麼難點,希望大家能夠在我提供的代碼實作上進行些許優化,比如當i=index時,不需要交換,等等!