插入排序
簡介
插入排序的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序
列,對於未排序數據,在已排序的序列中從後向前掃描,找到相依的插入位置。插
入排序在實現上,通常採用in-place排序(即只需用到O(1)的額外空間的排序),
因而再從後像前掃描的過程中,需要反覆把已排序的元素逐步向後挪位,爲最新的
元素提供插入空間。
描述過程
1.從第一個元素開始,該元素可以認爲已經被排序。
2.取出下一個元素,在已排序的元素序列中從後向前掃描。
3.如果該元素(寶庫已排序)大於新的元素,該元素移動到下一個位置。
4.重複第3步,直到找到已排序的元素小於或者等於新元素的位置。
5.將新元素插入到該位置後,重複2~5步。
演示圖
第一步:默認是第一個數已排序
第二步 44比3大就默認已排序到第二的位置
第三步 取出38從後向前對比
第四步:從後向前對比,放入第2個位置
第5步:依次類推
大白話理解
一個數組中,默認第一個元素已經被排序了。取出第二個元素跟第一個元素比較大
小。大的就原地插入,小就向前插入。取出第三個元素從後向前依次比較。比第二
元素小就繼續跟第一個元素比較。比第二元素大就原地插入。依次類推,直到所有
元素比較完,排序就完成了。
代碼演示
public class InsertSort {
public static void main(String[] args) {
int[] arr = {8,1,9,2,7,4,5,3,6};
sort(arr);
}
public static void sort(int[] arr) {
if(arr == null || arr.length <= 1) {
return ;
}
int current;
for(int i = 0; i < arr.length -1; i++) {
current = arr[i+1];
int preIndex = i;
while(preIndex >= 0 && current < arr[preIndex]) {
arr[preIndex+1] = arr[preIndex];
preIndex --;
}
arr[preIndex +1] = current;
}
System.out.println(Arrays.toString(arr));
}
}
結論
插入排序 |
|
平均時間複雜度 |
O(n²) |
最好情況 |
O(n) |
最壞情況 |
O(n²) |
空間複雜度 |
O(1) |
排序方式 |
In-place (內排序) |
穩定性 |
Y |