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

2021-10-06 20:01:29 字數 1782 閱讀 6608

插入排序演算法也是乙個複雜度為o(n^2)的排序演算法,它的原理跟打撲克類似。在打撲克時,每摸到一張牌我們都會把它插入到手上撲克中的正確位置。那麼在排序中就是進行兩重迴圈,第一重迴圈遍歷陣列,第二重迴圈將當前元素插入到之前元素中合適的位置。給一組演示加深理解

對於第乙個元素因為之前沒有元素,不需要插入操作。

對於第二個元素,跟前面的元素依次相比,6小於8,將6和8交換位置。下面也是同理,第三個元素依次與之前的元素比較,將其插入到合適位置。

}}對於for迴圈中的if判斷可以放到for迴圈中進行

for

(int j = i ; j >

0&& arr[j]

< arr[j-1]

; j --

)swap

( arr[j]

, arr[j-1]

);

同樣是o(n^2)的排序演算法,但是相比較於選擇排序,插入排序可以在迴圈中的某些情況下提前結束,所以理論上插入排序要比選擇排序要快。但是上述演算法在實際執行中的時間往往高於選擇排序,這是因為插入排序中有許多交換操作,這種操作要比單純的比較要耗時,所以會出現插入排序執行時間大於選擇排序。

那麼有沒有辦法減少交換操作,降低執行時間呢?答案是有的,就是利用賦值操作代替交換操作。因為交換操作進行了三次賦值,而單純賦值只有一次,所以時間要短一點。

具體操作原理是在第二重迴圈時首先將當前值複製,然後與前乙個數進行比較,如果比前乙個值小,則將前乙個值賦值到後乙個位置。圖形示意如下

}}此時插入排序的執行時間會大幅減少,此時它的效率會高於選擇排序。

同時,對於乙個近乎有序的陣列,插入排序演算法的執行速度更加快速,這是因為對於乙個近乎有序的陣列,每個元素原來的位置就是正確的位置,那麼就沒必要進行複製操作,複雜度也就降為**o(n)**級別,這種複雜度會比後面的o(nlogn)的演算法還要快,所以在某些複雜排序演算法中可以使用插入排序作為子過程處理較小規模的資料。

參考:

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

插入排序的基本思想是每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。常見的插入排序有插入排序 insertion sort 希爾排序 shell sort 二叉查詢樹排序 tree sort 圖書館排序 library sort patien...

插入排序演算法(C實現)

總體思路是 先記錄每一次要插入的值,插入的值依次與前面插入的值比較大小,直到找到那個值,然後後面的值全部後移空出的位置,就是他的正確位置。迴圈n次實現排序。printf 排序之前 n for int i 0 i 5 i insertvalue a,5 printf n printf 排序之後 n f...

C 實現插入排序演算法

插入排序演算法的原理 從前往後依次把元素插入到相應的位置。比插入元素大的向後移乙個單位,直到找到比其小或者相等的元素才停止迴圈,並把元素插入到當前位置。時間複雜度 o n 2 以下為實現 include using namespace std void sort int arr,int length...