經典演算法(19)教你兩分鐘學會【選擇排序】

揚帆向海發表於2020-02-17

寫在前面: 我是 揚帆向海,這個暱稱來源於我的名字以及女朋友的名字。我熱愛技術、熱愛開源、熱愛程式設計。技術是開源的、知識是共享的

這部落格是對自己學習的一點點總結及記錄,如果您對 Java演算法 感興趣,可以關注我的動態,我們一起學習。

用知識改變命運,讓我們的家人過上更好的生活

相關文章

經典演算法:氣泡排序及其優化

經典演算法:圖文並茂解析 快速排序

經典演算法:圖文並茂解析 堆排序


一、選擇排序介紹

選擇排序(Selection sort)是一種簡單直觀的排序演算法。

二、演算法思想

第 1 趟 從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置;
然後再從剩餘的未排序元素中尋找到最小(大)元素,放到已排序的序列的末尾。
以此類推,直到全部待排序的資料元素的個數為零,元素全部有序。

三、實現過程

在這裡插入圖片描述


規律

  • 第 1 趟:從n個資料中找出最小的資料和第一個資料交換
  • 第 2 趟:從第二個資料開始的n-1個資料中再選出最小的資料與第二個資料交換
  • 以此類推…
  • 第 i 趟,則從第 i 個資料開始的 n-i+1 個資料中選出最小的資料與第i個資料交換,直到整個序列有序

四、程式碼實現

public class SelectSort {
    public static void main(String[] args) {
        System.out.println("輸入要排序的值,輸入的每個值用逗號隔開:");
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();
        // 將字串按照","拆分成字串陣列
        String[] strArray = str.split(",");
        // 新建陣列用來儲存拆分出來的每個值
        int[] array = new int[strArray.length];
        // 給陣列迴圈遍歷賦值
        for (int i = 0; i < strArray.length; i++) {
            array[i] = Integer.parseInt(strArray[i]);
        }

        System.out.println("排序前的陣列:" + Arrays.toString(array));
        // 排序
        selectSort(array);
        System.out.println("排序後的陣列:" + Arrays.toString(array));
    }

    /**
     * 選擇排序
     *
     * @param array 待排序的陣列
     */
    private static void selectSort(int[] array) {

        //判斷陣列為空或為一個元素的情況
        if (null == array || array.length <= 1) {
            return;
        }

        for (int i = 0; i < array.length - 1; i++) {
            int tempIndex = i; // 當前最小元素的索引
            int temp = array[i]; // 臨時變數為當前最小元素
            // 迴圈遍歷待排序的陣列
            for (int j = i + 1; j < array.length; j++) {
                // 如果發現有比這個最小位置處的元素更小的元素,則將那個更小的元素的下標賦給臨時變數
                if (temp > array[j]) {
                    temp = array[j];
                    tempIndex = j;
                }
            }
            // 如果臨時變數發生改變,則說明有比當前外層迴圈位置更小的元素,需要將這兩個元素交換位置
            if (tempIndex != i) {
                array[tempIndex] = array[i];
                array[i] = temp;
            }
            System.out.println("   第" + (i + 1) + "趟後:" + Arrays.toString(array));
        }
    }
}

執行結果
在這裡插入圖片描述


由於水平有限,本部落格難免有不足,懇請各位大佬不吝賜教!

相關文章