基礎演算法【3】:插入排序InsertionSort
阿新 • • 發佈:2018-12-17
-
插入排序:
-
插入排序類似於大多數人安排撲克牌的方式:
-
從你手中的一張牌開始,
-
選擇下一張卡並將其插入到正確的排序順序中,
-
對所有的卡重複上一步。
-
-
-
分析:
-
外迴圈執行N-1次,這很明顯。
-
但內迴圈執行的次數取決於輸入:
-
在最壞的情況下,陣列被反向排序並且(a [j]> X)始終為真插入始終發生在陣列的前端,並且內部迴圈以O(N)執行。
-
在最好的情況下,陣列已經排序並且(a [j]> X)總是為假所以不需要移位資料,並且內部迴圈執行在O(1),
-
因此,最佳情況時間是O(N × 1) = O(N) ,最壞情況時間是O(N × N) = O(N2).
-
-
-
程式碼:
void InsertionSort(int *arr, int num) { int ret = 0; int sorted, unsort; int to_insert; for (unsort = 1; unsort < num; unsort++) { to_insert = arr[unsort]; printf("-----------%02d---------\n", unsort); for (sorted = unsort - 1; sorted >= 0 && arr[sorted] > to_insert; sorted--) { printf("[index:%2d<-%2d] data:%2d<-%2d\n", sorted+1, sorted, arr[sorted+1], arr[sorted]); arr[sorted + 1] = arr[sorted]; } printf("[index:%2d<-%2d] data:%2d<-%2d\n", sorted+1, unsort, arr[sorted+1], to_insert); arr[sorted + 1] = to_insert; } return; }