[資料結構與演算法]-排序演算法之插入排序(insertion sort)及其實現(Java)
本文歡迎轉載,轉載前請聯絡作者,經允許後方可轉載。轉載後請註明出處,謝謝! http://blog.csdn.net/colton_null 作者:喝酒不騎馬 Colton_Null from CSDN
一.什麼是插入排序?
插入排序(insertion sort)是最簡單的排序演算法之一。它是一個穩定的排序演算法。
(Tips:所謂穩定,即兩個相同元素,排序前和排序後他倆的順序不發生改變。當然,這跟具體實現有一定關係。)
如果一個陣列由N個元素組成,則插入排序由N - 1趟排序組成。對於p = 1到N - 1趟,插入排序保證從位置0到位置p上的元素為已排序狀態。
即第一趟,從下標1處元素進行排序,保證陣列0~1位置上的元素有序。
第二趟,從下標2處元素進行排序,保證陣列0~2位置上的元素有序。
……
第N - 1趟,從下標N - 1處元素進行排序,保證陣列0~N - 1位置上的元素有序。到此,整個陣列排序完畢。
二.插入排序的舉例實踐
對於陣列[46, 34, 32, 12, 14, 9]
- p = 1趟之後:[34, 46, 32, 12, 14, 9]
- p = 2趟之後:[32, 34, 46, 12, 14, 9]
- p = 3趟之後:[12, 32, 34, 46, 14, 9]
- p = 4趟之後:[12, 14, 32, 34, 46, 9]
- p = 5趟之後:[9, 12, 14, 32, 34, 46]
三.插入排序復程式碼實現
InsertionSort.java
public class InsertionSort {
/**
* InsertionSort 插入排序
*
* @param arr 被排序的陣列
* @param <T>
*/
public static <T extends Comparable<? super T>> void insertionSort(T[] arr) {
int p;
for (int i = 1; i < arr.length; i++) {
// 儲存當前訪問的節點值
T tmp = arr[i];
for (p = i; p > 0 && tmp.compareTo(arr[p - 1]) < 0; p--) {
// 如果tmp小於arr[p - 1]的值,則後移一位
arr[p] = arr[p - 1];
}
// 將tmp替換p位置的值(上面的for已經將原來的p後移了)
arr[p] = tmp;
}
}
}
InsertionSortTest.java 測試類
public class InsertionSortTest {
public static void main(String[] args) {
Integer[] arr = {46, 34, 32, 12, 14, 9};
InsertionSort.insertionSort(arr);
print(arr);
}
private static <T> void print(T[] arr) {
for (T t : arr) {
System.out.print(t.toString() + " ");
}
System.out.println();
}
}
測試陣列:[46, 34, 32, 12, 14, 9]
輸出:9 12 14 32 34 46
四.插入排序演算法複雜度分析
最壞情況,陣列為倒序,巢狀迴圈的每次迴圈都要消耗N次迭代,因此插入排序的時間複雜度為O(N²)。
理想情況下,如果陣列已經是排序好的情況,時間複雜度則為O(N)。
插入排序過程使用了i、p、tmp三個輔助變數,與問題規模無關,所以空間複雜度為O(1)。
有關[資料結構與演算法]的學習內容已經上傳到github,喜歡的朋友可以支援一下。 data-structures-and-algorithm-study-notes-java
站在前人的肩膀上前行,感謝以下部落格及文獻的支援。
- 排序演算法總結之插入排序
- 圖解插入排序–直接插入排序
- 《資料結構與演算法分析(第3 版) 工業出版社》
相關文章
- 排序演算法之「插入排序(Insertion Sort)」排序演算法
- 排序演算法(3)插入排序(Insertion Sort)排序演算法
- 2.插入排序演算法(Insertion_Sort)排序演算法
- 插入排序(Insertion Sort)排序
- 演算法與資料結構系列 ( 四 ) - 插入排序法- Insert Sort演算法資料結構排序
- 演算法與資料結構系列 ( 五 ) - 插入排序法改進- Insert Sort演算法資料結構排序
- 演算法與資料結構基礎 - 排序(Sort)演算法資料結構排序
- python演算法與資料結構-插入排序(34)Python演算法資料結構排序
- 資料結構與演算法——常用高階資料結構及其Java實現資料結構演算法Java
- 04資料結構排序演算法之直接插入排序資料結構排序演算法
- 資料結構與演算法之排序資料結構演算法排序
- js實現資料結構及演算法之排序演算法JS資料結構演算法排序
- Array.sort 演算法原理(插入排序\快速排序in-place實現)演算法排序
- 演算法與資料結構系列 ( 七 ) - 歸併排序- Merge Sort演算法資料結構排序
- Java資料結構與排序演算法 (三)Java資料結構排序演算法
- Java資料結構與排序演算法 (一)Java資料結構排序演算法
- Java資料結構與排序演算法 (二)Java資料結構排序演算法
- 資料結構與演算法之快速排序資料結構演算法排序
- 演算法與資料結構系列 ( 六 ) - 氣泡排序法- Bubble Sort演算法資料結構排序
- 演算法與資料結構系列 ( 三 ) - 選擇排序法- Select Sort演算法資料結構排序
- Java 資料結構與演算法系列之氣泡排序Java資料結構演算法排序
- 07 Javascript資料結構與演算法 之 排序演算法JavaScript資料結構演算法排序
- Java實現氣泡排序和插入排序演算法Java排序演算法
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- 演算法與資料結構之原地堆排序演算法資料結構排序
- 演算法與資料結構高階排序演算法之歸併排序演算法資料結構排序
- [資料結構與演算法] 排序演算法資料結構演算法排序
- 資料結構與演算法——排序資料結構演算法排序
- Java常見排序演算法之插入排序Java排序演算法
- 資料結構和演算法(Golang實現)(25)排序演算法-快速排序資料結構演算法Golang排序
- 資料結構與演算法——排序演算法-歸併排序資料結構演算法排序
- 資料結構與演算法——排序演算法-基數排序資料結構演算法排序
- 資料結構與演算法——排序演算法-氣泡排序資料結構演算法排序
- 資料結構與演算法——排序演算法-選擇排序資料結構演算法排序
- 演算法與資料結構-棧(Stack)-Java實現演算法資料結構Java
- 資料結構與演算法--簡單棧實現及其應用資料結構演算法
- 資料結構與演算法(八):排序資料結構演算法排序
- 資料結構與演算法:堆排序資料結構演算法排序