插入排序的基本思想是每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。常見的插入排序有插入排序(insertion sort),希爾排序(shell sort),二叉查詢樹排序(tree sort),圖書館排序(library sort),patience排序(patience sort)。下面介紹前兩種:
(一)直接插入排序
最差時間複雜度:o(n^2)
最優時間複雜度:o(n)
平均時間複雜度:o(n^2)
穩定性:穩定
直接插入排序(insertion sort),是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對未排序的資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。
插入排序演算法的一般步驟:
1.從第乙個元素開始,該元素可以認為已被排序;
2.取出下乙個元素,在已經排序的元素序列中從後向前掃瞄;
3.如果該元素(已排序)大於新元素,將該元素移到下乙個位置;
4.重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;
5.將新元素插入到該位置後,重複2~5
演算法示意圖:
實現**:
void insertionsort(int *a, int len)
a[i+1] = key;
}}
(二)希爾排序平均時間複雜度:o(nlogn)
穩定性:不穩定
希爾排序(shell sort),也稱為遞減增量排序演算法,是插入排序的一種高速而穩定的改進版本。希爾排序是基於插入排序的以下兩點性質而提出改進方法的:1.插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率;2.但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位。
希爾排序的一般步驟為:
1.先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中,在各組內進行直接插人排序。
2.取第二個增量d2演算法示意圖:
實現**:
void shellsort(int *a, int len)
a[i+h] = key;
} h = h/3;
}}
排序演算法 插入排序 C 實現
插入排序演算法也是乙個複雜度為o n 2 的排序演算法,它的原理跟打撲克類似。在打撲克時,每摸到一張牌我們都會把它插入到手上撲克中的正確位置。那麼在排序中就是進行兩重迴圈,第一重迴圈遍歷陣列,第二重迴圈將當前元素插入到之前元素中合適的位置。給一組演示加深理解 對於第乙個元素因為之前沒有元素,不需要插...
插入排序演算法(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...