1. 程式人生 > 其它 >📚 選擇排序和插入排序區別-DS筆記

📚 選擇排序和插入排序區別-DS筆記

選擇排序法

  • A[i...n)未排序,A[0...i)已排序

  • A[i...n]中最小值要放到A[i]的位置

  • 複雜度 \(O(n^2)\)

    第一層迴圈n次

    第二層迴圈:i=0,n次;i=1,n-1次......i=n-1,1次。即1+2+3+...+n

    public static void sort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            int minIdx = i;
            // 選擇A[i...n]中的最小值的索引
            for (int j = i; j < arr.length; j++) {
                if (arr[j] < arr[minIdx])
                    minIdx = j;
            }
            swap(arr, i, minIdx);
        }
    }
    
    /* 使用帶約束的泛型 */
    public static <E extends Comparable<E>> void sort(E[] arr) {
            for (int i = 0; i < arr.length; i++) {
                int minIdx = i;
                for (int j = i; j < arr.length; j++) {
                    if (arr[j].compareTo(arr[minIdx]) < 0)
                        minIdx = j;
                }
                swap(arr, i, minIdx);
            }
    }
    

    比較引用型別必須要實現Comparable 介面!

插入排序

  • A[i...n)未排序,A[0...i)已排序

    將arr[i]插入適當的位置

  • 整體複雜度 \(O(n^2)\)

    對於有序陣列,插入排序的複雜度是\(O(n)\)

public <E extends Comparable<E>> void insertSort(E[] arr) {
    for (int i = 0; i < arr.length; i++) {
        // 將arr[i]插入適當的位置
        for (int j = i; j-1 >= 0; j--)
            if (arr[j].compareTo(arr[j-1]) < 0)
                swap(arr, j, j-1); 
        	else break;
    }
}

/* 小優化 */
public <E extends Comparable<E>> void insertSort2(E[] arr) {
    for (int i = 0; i < arr.length; i++) {
        int t = arr[i];  // 暫存arr[i]
        int j;
        for (j = i; j-1>=0 && t.comparaTo(arr[j-1]) < 0) {
            arr[j] = arr[j-1];  // 向後移動元素
        }
        arr[j] = t;
    }
}

區別:

選擇排序:每一趟從待排序的資料元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。

插入排序:將元素逐個插入到有序排列之中,其特點是要不斷的移動資料,空出一個適當的位置,把待插入的元素放到裡面去



本文來自部落格園,作者:Arway,轉載請註明原文連結:https://www.cnblogs.com/cenjw/p/Select-Sort_Insert-Sorting-Different-ds-Notes.html