排序演算法之插入排序及C 實現

2021-10-25 15:38:59 字數 1435 閱讀 8231

插入排序思想:假設[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點的**:

template

<

typename t>

void

insertsort

(t* arr, size_t size)

else

} arr[j +1]

= temp;

}}

第2點的**:沒貼出來,讀者可以自己實現。二分查詢的變種。

二分雖說簡單,但是要寫出來還是沒那麼容易的,《程式設計珠璣》書中作者談到,在美國一所大學授課的時候,作者要求學生在紙上寫出二分查詢的**,只要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...