📚 選擇排序和插入排序區別-DS筆記
阿新 • • 發佈:2022-03-02
選擇排序法
-
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