1.插入排序:
插入排序可以視為兩步操作,一步是插入,一步是排序。插入排序的基本思想是將一條記錄插入到已經有序的序列中,繼而得到乙個有序的,資料個數加一的新序列。
2.直接插入排序:
直接插入排序把待排序序列視為兩部分:一部分是有序序列,通常在排序開始之時將序列中的第乙個資料視為有序序列;另一部分為待排序序列,有序序列之後的資料視為待排序序列。
下面給出使用直接插入排序演算法將待排序序列轉化為降序序列的**實現:
void insertsort(int* arr,int n)
}}
直接插入演算法的時間複雜度為o(n^2),因為在判斷語句中,不會改變兩個鍵值大小相同的記錄在序列中的順序,所以該演算法是乙個穩定的演算法。
3.折半插入排序:
折半插入排序是對直接插入排序的改進。在直接插入排序中,主要的時間消耗在於資料的比較和移動上。由於在前半部分的序列已經有序,在為新資料尋找插入點時,可以採用折半查詢的方法來提高尋找速度。
折半查入中的核心是插入點的查詢,若插入點為k,找到插入點後,將有序序列中插入點之後的資料依次後移一位,將新資料插入到下標為k處。
使用折半排序的演算法實現如下:
int binarysort(int* arr,int n)
//移動有序序列中插入點之後的元素
for(j=i-1;j>=high+1;j--)
arr[j+1]=arr[j];
arr[high+1]=tmp;//將待排序資料插入有序序列
}}
折半插入排序節省了排序過程中比較的次數,但是移動的次數與直接插入排序相同,所以其時間複雜度仍o(n^2).。分析演算法可知,在兩個資料關鍵字相同時,不會交換資料順序,所以該演算法是乙個穩定的演算法。
4.希爾排序:
希爾排序的基本思想是:先取定乙個小於n的整數d1作為第乙個增量,把序列的全部元素分為d1個組,所有相互間的距離為d1整數倍的元素放在同乙個組中,在各組內進行直接插入排序;然後,取第二個增量d2(d2
void shellsort(int* arr,int n)
arr[j+d]=tmp;
}d=d/2;
}}
希爾排序的核心演算法仍為直接插入排序,但是希爾演算法比直接插入排序多設定了乙個步長增量,從而有效地減少了每輪排序比較的次數和比較的輪數,明顯降低了時間消耗。
希爾排序的時間複雜度難以估計,通常認為時o(n^1.3)。另外希爾排序是乙個不穩定的演算法。
內部排序之插入排序 希爾排序
插入排序 insertion sort 插入排序由n 1趟 pass 排序組成,對於p 1趟到p n 1趟,插入排序可以保證從位置零到位置p上的元素全部有序,有這樣乙個事實 1 當插入p位置 設為data 的時候,從0位置到p 1已全部有序,如果data比p 1位置上的元素大,那麼直接放在p位置即可...
詳談內部排序之各種插入排序
如上圖的插入撲克牌就是生活中最常見的插入排序。直接插入排列過程 先將序列中第 1 個記錄看成是乙個有序子串行,然後從第 2 個記錄開始,逐個進行插入,直至整個序列有序。例題 為直接插入排序的詳細過程,其中有一些注意事項 1 資料中有兩個49,其中乙個加粗,用來判斷這兩個49的前後順序是否發生變化,然...
內部排序演算法 插入排序
插入排序演算法 insert sorting 基本思想 把n個待排序的元素看成乙個有序表和乙個無序表,開始時有序表只包含乙個元素,無需表包含n 1個元素,排序的過程 中每次從無序表中取出來第乙個元素把它的排序碼一次與有序表元素進行比較,將它插入到有序表中適當的位置,使之成為新的有序表。實現方法一 f...