直接插入排序
直接插入排序(Straight Insertion Sort)是一種最簡單的排序方法,其基本操作是將一條記錄插入到已排好的有序表中,從而得到一個新的、記錄數量增1的有序表
算法原理
每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。
第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個數據與前兩個數從後向前掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃描以後就完成了整個排序過程
複雜度及穩定性
平均時間複雜度 | 最優時間複雜度 | 最壞時間複雜度 | 空間複雜度 | 穩定性 |
---|---|---|---|---|
O(N^2) | O(N) | O(N^2) | O(1) | 穩定 |
動畫演示
視頻演示
代碼實現
-
python
# 利用Python list的insert方法,如果需要倒序,只需將array[j] >= current改爲小於即可 def insert_sort(array): for i in range(1, len(array)): current = array[i] for j in range(i): if array[j] >= current: array.insert(j, current) array.pop(i+1) break return array # 直接移動元素的方法,如果需要倒序,只需將array[pre_index] > current 改爲小於即可 def insert_sort2(array): for i in range(1, len(array)): pre_index = i-1 current = array[i] while pre_index >= 0 and array[pre_index] > current: array[pre_index+1] = array[pre_index] pre_index -= 1 array[pre_index+1] = current return array print(insert_sort([2, 4,3,10,9, 1, 8, 5, 5])) print(insert_sort2([2, 4,3,10,9, 1, 8, 5, 5])) # [1, 2, 3, 4, 5, 5, 8, 9, 10]
-
java
static int[] insertSort(int[] listData){ for(int i=1;i< listData.length; i++){ int current = listData[i]; int j = i - 1; while (j >= 0 && current <=listData[j]){ listData[j+1] = listData[j]; j --; } listData[j+1] = current; } return listData; } // 查看輸出,如果需要倒序,則將current <=listData[j]改爲大於即可 public static void main(String[] args) { int[] test = insertSort(new int[]{2, 4,3,10,9, 1, 8, 5, 5}); for (int i: test) { System.out.println(i); } } // [1, 2, 3, 4, 5, 5, 8, 9, 10]
算法優化
直接插入排序還有一種改進算法,叫做折半插入排序,比直接插入算法明顯減少了關鍵字之間比較的次數,因此速度比直接插入排序算法快,但記錄移動的次數沒有變,所以折半插入排序算法的時間複雜度仍然爲O(n^2),與直接插入排序算法相同 。首先找好待排元素在已排好序列表中的插入位置,然後移動元素插入。
-
python
# 利用insert的方法,反序將array[middle] > current改爲小於 def insert_sort(array): for i in range(0, len(array)): current = array[i] low = 0 high = i while low <= high: middle = (low + high) // 2 if array[middle] > current: high = middle - 1 else: low = middle + 1 array.insert(low, current) array.pop(i+1) return array # 直接移動的方法,反序將array[middle] > current改爲小於 def insert_sort2(array): for i in range(0, len(array)): pre_index = i-1 current = array[i] low = 0 high = i while low <= high: middle = (low + high) // 2 if array[middle] > current: high = middle - 1 else: low = middle + 1 for j in range(low, i): array[pre_index+1] = array[pre_index] pre_index -= 1 array[pre_index + 1] = current return array print(insert_sort([2, 4,3,10,9, 1, 8, 5, 5])) print(insert_sort2([2, 4,3,10,9, 1, 8, 5, 5])) # [1, 2, 3, 4, 5, 5, 8, 9, 10]
-
java
static int[] insertSort(int[] listData){ for(int i=1;i< listData.length; i++) { int current = listData[i]; int low = 0; int high = i; int pre_index = i - 1; while (low <= high){ int middle = (low + high) / 2; if (listData[middle] > current){ high = middle -1; }else { low = middle + 1; } } for(int j = low; j< i;j++){ listData[pre_index +1] = listData[pre_index]; pre_index -= 1; } listData[pre_index+1] = current; } return listData; } // 查看輸出,反序將listData[middle] > current改爲小於 public static void main(String[] args) { int[] test = insertSort(new int[]{2, 4,3,10,9, 1, 8, 5, 5}); for (int i: test) { System.out.println(i); } }