插入排序的基本思想是每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。常見的插入排序有插入排序(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 實現插入排序
感謝morewindows的文章,造福我等學渣啊 複雜度應該也是o n 2 using system using system.collections.generic using system.linq using system.text namespace 排序 if j i 1 將待插入的a i...
插入排序 C 實現
寫給自己!插入排序演算法,其如同打牌,手裡總是已經排好續的牌,而桌面上的是未知牌,其思想是 拿起一張牌,與手中的牌從右到左 從大到小 進行比較,找到合適的位置插入即可。插入排序演算法沒有合併排序算好效率高,他隨著輸入的增大而增大。思想 對於將要插入的第j個元素,與已經排序好的0 j 1個元素從j 1...
插入排序C 實現
演算法描述 從陣列第二個元素開始向後掃瞄,將每個元素插到它前面所有元素的合適位置。下面給出整數陣列的實現,對於其他複雜型別只需實現相應的自定義比較函式即可 include include using namespace std const int num 20 void exch int s,int...