排序

選擇排序(Selction Sort)

基本思路:選擇某個索引位置的元素,然後和後面的元素依次比較,若大於則交換位置,經過第一輪比較排序後可以得出最小值,然後使用同樣的方法把剩下的元素逐個比較即可。 
可以看出選擇排序,第一輪會選出最小值,第二輪會選擇第二個小的值,直到最後。 
第一輪從arr[0]和後面的元素比較,第二輪從arr[1]和後面的元素比較,一次類推n個元素要進行n-1輪。選擇排序每一輪只進行一次交換,相對於冒泡排序效率高一些。

這裏寫圖片描述
圖解:前三次比較arr[0]都是小的,所以沒有交換,第四次比較的時候arr[0]更大,交換位置。

下面我們來看看代碼怎麼寫的:

    // 選擇排序,分析 找規律
    public static void selectionSort(int[] arr){
        // 第一輪
        for (int i=1; i<=arr.length-1; i++){
            if (arr[0] > arr[i]){
                // 交換順序
                int tmp = arr[0];
                arr[0] = arr[i];
                arr[i] = tmp;
            }
        }
        // 第二輪
        for (int i=2; i<=arr.length-1; i++){
            if (arr[1] > arr[i]){
                // 交換順序
                int tmp = arr[1];
                arr[1] = arr[i];
                arr[i] = tmp;
            }
        }
        // 第二輪
        for (int i=3; i<=arr.length-1; i++){
            if (arr[2] > arr[i]){
                // 交換順序
                int tmp = arr[2];
                arr[2] = arr[i];
                arr[i] = tmp;
            }
        }
        //...
        //...
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

找到規律,最後代碼簡化如下:

    /**
     * 選擇排序
     * @param arr
     */
    public static void selectionSort(int[] arr){
        for (int times=1; times<=arr.length-1; times++){
            for (int i=times; i<=arr.length-1; i++){
                if (arr[times-1] > arr[i]){
                    // 交換順序
                    int tmp = arr[times-1];
                    arr[times-1] = arr[i];
                    arr[i] = tmp;
                }
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章