分類 ------------- 內部比較排序
數據結構 ---------- 數組
最差時間復雜度 ---- 最壞情況為輸入序列是降序排列的,此時時間復雜度O(n^2)
最優時間復雜度 ---- 最好情況為輸入序列是升序排列的,此時時間復雜度O(n)
平均時間復雜度 ---- O(n^2)
所需輔助空間 ------ O(1)
穩定性 ------------ 穩定
原理
???????對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。插入排序在實現上,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從后向前掃描過程中,需要反復把已排序元素逐步向后挪位,為最新元素提供插入空間。
步驟
- 從第一個元素開始,該元素可以認為已經被排序
- 取出下一個元素,在已經排序的元素序列中從后向前掃描
- 如果該元素(已排序)大于新元素,將該元素移到下一位置
- 重復步驟3,直到找到已排序的元素小于或者等于新元素的位置
- 將新元素插入到該位置后
- 重復步驟2~5
代碼實現
public class InsertionSort {
void sort(Integer[] array) {
for (int i = 1 ;i < array.length;i++){
int j = i - 1;
Integer item = array[i];
while (j >= 0 && array[j] > item){
array[j + 1] = array[j];
j--;
}
array[j + 1] = item;
}
}
public static void main(String[] args){
Integer[] a = {3,4,1,9,5,2,6,10,20,16,13,11,0};
InsertionSort sort = new InsertionSort();
sort.sort(a);
System.out.println("array by InsertionSort is " + Tool.arrayToString(a));
}
}
public class Tool {
public static <T> String arrayToString(T[] array){
StringBuilder builder = new StringBuilder("[");
for (int i = 0; i < array.length; i++){
T item = array[i];
builder.append(item + "");
if (i != array.length - 1){
builder.append(",");
}
}
builder.append("]");
return builder.toString();
}
public static <T> void exchange(T[] array, int i, int j){
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
實現結果:
array by InsertionSort is [0,1,2,3,4,5,6,9,10,11,13,16,20]
插入排序的改進:二分插入排序
public class BinaryInsertionSort {
void sort(Integer[] array) {
for (int i = 1; i < array.length; i ++){
Integer get = array[i];
// left和right之間為已排序數組
int left = 0;
int right = i - 1;
// 以二分發查找get的位置
while (left <= right){
//獲取中間位置
int middle = (left + right) / 2;
// 不縮小left和right的距離
if (array[middle] > get){
right = middle - 1;
}
else{
left = middle + 1;
}
}
//所有在left右面的位置都右移了一個位置
for (int j = i - 1; j >= left; j--)
{
array[j + 1] = array[j];
}
// 把get插入left的位置
array[left] = get;
}
}
public static void main(String[] args){
Integer[] a = {3,4,1,9,5,2,6,10,20,16,13,11,0};
BinaryInsertionSort sort = new BinaryInsertionSort();
sort.sort(a);
System.out.println("array by BinaryInsertionSort is " + Tool.arrayToString(a));
}
}
實現結果
array by BinaryInsertionSort is [0,1,2,3,4,5,6,9,10,11,13,16,20]