插入排序思想:假設[0, i - 1]位置有序,將 i 位置元素插入到前面有序陣列中適當的位置。一直到最後一趟,[0, n - 2]位置有序,將 n -1 位置元素插入進去即可。
插入排序:我們拆詞,」插入「,如何理解」插入「這個詞?理解了就簡單了。
插入排序屬於比較類的排序。
插入排序是穩定的。
最簡單的demo:
上面這個是最簡單的實現,有很多可以改進的地方。template
<
typename t>
inline
void
swap
(t* arr, size_t lhs, size_t rhs)
template
<
typename t>
void
insertsort
(t* arr, size_t size)}}
}
假設 [0, i - 1]有序,現在需要把 i 位置元素插入到前面有序陣列的適當位置;
上面**是一直與前乙個比較交換、比較交換,能不能先一直比較,直到找到正確位置,再最後交換一次即可呢?copy可是很費時的乙個操作。
[0, i - 1]有序呢,「有序」,能二分查詢(binary search)?
上面都是可以實現的。
第1點的**:
第2點的**:沒貼出來,讀者可以自己實現。二分查詢的變種。template
<
typename t>
void
insertsort
(t* arr, size_t size)
else
} arr[j +1]
= temp;
}}
二分雖說簡單,但是要寫出來還是沒那麼容易的,《程式設計珠璣》書中作者談到,在美國一所大學授課的時候,作者要求學生在紙上寫出二分查詢的**,只要20%的人能夠真正讓作者滿意,「紙上談兵」可不是乙個好事。
結果:
有個問題:這裡我就用了這麼簡單乙個例子,肯定說明不了這個演算法是正確的。
可以設計對數器去判斷,氣泡排序肯定是不會寫錯的,用隨機生成的陣列(元素隨機,每個陣列元素 個數也隨機)去同時跑冒泡和待比較的排序演算法,跑100000次,如果一次都沒有出錯,基本上可以證明待驗證演算法的正確性了。
平均時間複雜度 o(n^2)。
最好時間複雜度:正序,只需比較 n - 1 次,o(n)。
最差時間複雜度:逆序,o(n^2)。
空間複雜度都是 o(1)。
紙上得來終覺淺,絕知此事要躬行。
C 實現排序演算法之插入排序
include include include using namespace std void print int arr,int len cout endl void insertsort int arr,int len arr j 1 basic void main int len sizeo...
插入排序演算法之C 實現
插入排序,顧名思義其實現形式是插入.在整個大小不一的佇列中,第一次 從乙個元素開始,將後面相鄰的元素 第二個元素 提取出來,放在乙個變數中暫時儲存,然後和第二個元素前面的那個元素 第乙個元素 做比較,如果比它大,當然就不變動位置 但如果比它小,就將前面那個元素移動到第二個元素的位置,然後將變數的元素...
排序演算法 插入排序 C 實現
插入排序的基本思想是每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。常見的插入排序有插入排序 insertion sort 希爾排序 shell sort 二叉查詢樹排序 tree sort 圖書館排序 library sort patien...