選擇排序和插入排序


1.選擇排序

  1.何為選擇排序:

    以升序為例:

    1.將數組分為兩個子集,排序的和未排序的,每一輪從未排序的子集中選出最小的元素,放入排序子集.

    2.重復上述步驟,知道數組有序

  2.優化方式

    1.為減少交換次數,每一輪可以先找到最小的索引,再每輪最后交換元素的位置

  3.與冒泡排序比較

    1.兩者的時間復雜度都為O(n²)

    2.選擇排序一般快於冒泡排序,因為其交換次數少

    3.但如果集合有序度高,冒泡優於選擇

    4.冒泡屬於穩定排序算法,而選擇屬於不穩定排序算法

/**
 * 選擇排序
 */
public class SelectSort {
    public static void main(String[] args) {
        // 原始數據
        int[] arr = {1,4,2,7,5,8,9};
        // 選擇排序方法
        selectSort(arr);
    }

    private static void selectSort(int[] arr) {
        // 需要執行的輪次
        for (int i = 0; i < arr.length-1; i++) {
            // i 代表每輪最小元素需要交換到的索引
            int s = i;
            for (int j = s + 1; j < arr.length; j++) {
                // 和數組每個元素比對
                if (arr[s] > arr[j]) {
                    // 給最小元素索引賦值
                    s = j;
                }
            }
            // 判斷本輪最小元素是否就是本輪的索引i,如果不是說明發生了交換
            if (s != i) {
                swap(arr,s,i);
            }
            System.out.println(Arrays.toString(arr));
        }
    }

    public static void swap(int[] arr,int i,int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

}

2.插入排序

  1.何為插入排序

    1.將數組分為兩個區域,排序區域和未排序區域,每一輪從未排序區域中取出第一個元素,插入到排序區域(需要保證順序)

    2.重復上述步驟,直到整個數組有序

  2.優化方式

    1.待插入元素進行比較時,遇到比自己小的元素,就代表找到了插入位置,無需進行后續比較

    2.插入時可以直接移動元素,而不是交換元素

  3.與選擇排序比較

    1.兩者平均時間復雜度都是O(n²)

    2.大部分情況下插入都略優於選擇

    3.有序集合插入的時間復雜度是O(n)

    4.插入是穩定排序算法,選擇是不穩定排序算法

/**
 * 插入排序
 */
public class InsertSort {
    public static void main(String[] args) {
        // 原始數據
        int[] arr = {1,4,2,7,5,8,9};
        // 插入排序
        insertSort(arr);
    }

    private static void insertSort(int[] arr) {
        // i代表插入元素的索引
        for (int i = 1; i < arr.length; i++) {
            // t代表要插入元素的值
            int t = arr[i];
            // j代表已排序的元素索引
            int j = i - 1;
            // 如果數組第一個元素也比完了就跳過比較循環
            while (j >= 0) {
                // 如果要插入的元素小於最后一個已排序的元素
                if (t < arr[j]) {
                    // 最后一排元素往后移一位
                    arr[j + 1] = arr[j];
                }else {
                    //如果改值沒有比當前要插入元素小就跳出循環
                    break;
                }
                // 已排元素索引往前移一個,讓要插入的元素繼續與上一個已排元素比較
                j--;
            }
            // 把要插入的元素插入到最后比較的元素位置
            arr[j + 1] = t;
            System.out.println(Arrays.toString(arr));
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM