演算法(2) 插入排序演算法 java
阿新 • • 發佈:2018-11-14
簡介:插入排序和選擇排序一樣都是時間複雜度為O(N^2)的排序演算法,相較於選擇排序,插入排序可以提前終止內層迴圈,因此在效能上如果使用得當,要比選擇排序效能好,尤其是面對近乎有序的源資料時,效能更是碾壓選擇排序甚至會比一些O(NlgN)的演算法還要好.
原理:將一個數組劃分為兩部分,第一部分是已經排好序的,第二部分為未排序的,從未排序部分的第一個資料開始,逐一與前面已排好序的資料進行比較,如果比那個資料小就與之交換,直到該資料比當前資料大為止.按照以上原理將所有資料進行排序.
步驟
①從未排好序的資料中取出第一個資料,作為待排序資料A
②用A與前面已排好序的資料B進行對比用來確定A應該放到哪個位置,如果A比B還小就應該交換A與B,否則停止內層迴圈,該位置就是A應處於的位置
③重複①②步驟直到沒有未排序的資料為止
以下是執行截圖public class InsertionSort { public static void main(String[] args) { int[] arr = SortUtils.createArray(10000); int[] arr2 = SortUtils.copy(arr); sort(arr); betterSort(arr2); } public static void sort(int[] arr) { long starttime = System.currentTimeMillis(); for (int i = 1; i <= arr.length - 1; i++) { for (int j = i; j > 0 && arr[j - 1] > arr[j]; j--) { arr[j - 1] = arr[j - 1] + arr[j]; arr[j] = arr[j - 1] - arr[j]; arr[j - 1] = arr[j - 1] - arr[j]; } } System.out.println("sort time = " + (System.currentTimeMillis() - starttime) + " 毫秒"); } /** * 改進後的插入排序,在具有較少的元素型別值,或者比較有序的源資料進行排序時,可以有比較好的效果 * @param arr */ public static void betterSort(int[] arr) { long starttime = System.currentTimeMillis(); for (int i = 1; i <= arr.length - 1; i++) { int t = arr[i]; int j = i; for (; j > 0 && arr[j - 1] > t; j--) { arr[j] = arr[j - 1]; } if (j != i) { arr[j] = t; } } System.out.println("betterSort time = " + (System.currentTimeMillis() - starttime) + " 毫秒"); } }
結論:優化之後的插入排序比未優化的插入排序 效能會好一些, 比選擇排序更是全方位的勝出