選擇排序和插入排序
阿新 • • 發佈:2021-10-20
1.何為選擇排序:
以升序為例:
2.重複上述步驟,知道陣列有序
2.優化方式
1.為減少交換次數,每一輪可以先找到最小的索引,再每輪最後交換元素的位置
3.與氣泡排序比較
1.兩者的時間複雜度都為O(n²)
2.選擇排序一般快於氣泡排序,因為其交換次數少
3.但如果集合有序度高,冒泡優於選擇
/** * 選擇排序 */ publicclass 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; } }
1.何為插入排序
1.將陣列分為兩個區域,排序區域和未排序區域,每一輪從未排序區域中取出第一個元素,插入到排序區域(需要保證順序)
2.重複上述步驟,直到整個陣列有序
2.優化方式
1.待插入元素進行比較時,遇到比自己小的元素,就代表找到了插入位置,無需進行後續比較
2.插入時可以直接移動元素,而不是交換元素
3.與選擇排序比較
1.兩者平均時間複雜度都是O(n²)
2.大部分情況下插入都略優於選擇
3.有序集合插入的時間複雜度是O(n)
/** * 插入排序 */ 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)); } } }