插入排序的幾種演算法

2021-07-03 17:52:48 字數 1645 閱讀 7193

1.直接插入排序

直接插入排序是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的、記錄數增1的有序表。

一般情況下,第i趟直接插入排序的操作為:在含有i-1個記錄的有序子串行r[1…i-1]中插入乙個記錄r[i]後,變成含有i個記錄的有序子串行r[1…i];並且,和順序查詢類似,為了在查詢插入位置的過程中避免陣列下標出界,在r[0]處設定監視哨。在自i-1起往前搜尋的過程中,可以同時後移記錄。直接插入的時間複雜度為o(n²)。

void insertionsort(elem r , int n)

r[j+1]=r[0]; //插入到正確位置}}

}

2.折半插入排序

由於插入排序的基本操作就是在乙個有序表中進行查詢和插入,這個「查詢」可以利用「折半查詢」來實現,由此進行的插入排序稱之為折半插入排序,演算法如下。

void binsertsort(elem r , int n)else

}for(j=i-1;j>=high+1;--j)

r[j+1]=r[0]; //插入到正確位置}}

}

折半插入排序所需附加儲存空間和直接插入排序相同,從時間上比較,折半插入排序僅減少了關鍵字間的比較次數,而記錄的移動次數不變,因此時間複雜度仍為o(n²)。

3.表插入排序

typedef struct

slnode; /* 表結點型別 */

typedef struct

slinklisttype; /* 靜態鍊錶型別 */

void tableinsert(slinklisttype *sl,redtype d,int n)

(*sl).r[i+1].next=p; /* 將當前記錄插入靜態鍊錶 */

(*sl).r[q].next=i+1;

}(*sl).length=n;

}

表插入排序的時間複雜度仍為o(n²)。

4.希爾排序

希爾排序又稱為「縮小增量排序」,時間效率較前面幾種方法有很大改進。

直接插入排序為「正序」的時候,時間複雜度為o(n),由此可設想,待排序記錄序列關鍵字「基本有序,直接插入排序的效率就大大提高;從另一方面看,由於直接插入排序演算法簡單,則在n值很小時效率比較高。希爾排序正是從這兩點分析出發對直接插入排序進項改進得到的一種排序演算法。

它的基本思路是:先將整個待排記錄序列分割成若干個子串行分別進行直接插入排序,待整個序列中的記錄」基本有序「時,在對全體記錄進行一次直接插入排序。

特點是:子串行的構成不是簡單地逐斷分割,而是相隔某個」增量「的記錄組成乙個子串行,最後在進行一次增量是1的插入排序(等同於直接插入排序),此時序列以基本有序,只需要進行少量的比較和移動即可完成排序。

void  shellinsert(elemtype r , int dk)

r[j+dk]=r[0]; //插入}}

}void shellsort(elemtype r ,int dlta, int t)

}

幾種常見的排序(插入排序)

插入排序 insertsort 的執 況,假定這個陣列的序是排好的,然後從頭往後,如果有數比當前外層元素的值大,則將這個數的位置往後挪,直到當前外層元素的值大於或等於它前面的位置為止.演算法在排完前k個數之後,可以保證a 1 k 是區域性有序的,保證了插入過程的正確性.比較次數n n 1 2 移動次...

幾種排序演算法及其Python實現 插入排序

直接插入排序是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表。def insertsort l none j 0 x 0 for i in range 1,len l if l i l i 1 x l i l i l i 1 for j ...

插入排序演算法

插入排序演算法 思想 把排序過程看作是序列單個有序擴充套件為整體有序的過程,即首先取序列第二個元素與第乙個元素比較,將其插入合適位置,再將第三個元素與前兩個元素比較,將其插入合適位置,如此進行,直到最後取第n個元素與前n 1個元素進行比較並將其插入合適位置。演算法 建立日期 2004 12 14 插...