插入排序是一種簡單只管的排序方法,其基本思想在於每一次待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中,直到全部記錄插入完成。
假設在排序過程中,待排序表l[1….n]在某次排序過程中的某一時刻狀態如下:
為了實現將元素l(i)插入到已經有序的子串行l[1…i-1]中,我們需要執行以下操作:
1)查詢出l(i)在l[1…i-1]中的插入位置k。
2)將l[k…i-1]中所有元素全部後移乙個位置。
3)將l(i)複製到l(k)。
為了實現對l[1…n]的排序,可以將l(2)~l(n)依次插入到前面已排好序的子串行中,初始假定l[1]是乙個已經排好序的子串行。上述操作將執行n-1次就能得到乙個有序的表。插入排序在實現上通常採用就地排序(空間複雜度為o(1)),因此在從後向前的比較過程中,需要反覆把已排序元素逐步往後挪位,為新元素提供插入空間。
void insertsort(elemtype a,int n)
}
空間複雜度:僅使用了常數個輔助單元,因而空間複雜度為o(1)。
時間複雜度:在排序過程中,向有序子表中逐個地插入元素的操作進行了n-1趟,每趟操作都分為比較關鍵字和移動元素,而比較次數和移動次數取決於待排序表的初始狀態。
在最好的情況下,表種元素已經有序,此時插入每乙個元素都只需要比較一次而不用移動元素,因而時間複雜度為o(n)。
在最壞情況下,表中元素順序剛好和排序結果中元素順序相反(逆序)時,總的比較次數達到最大,為∑i,總的移動次數也達到最大,為∑i+1。
平均情況下,考慮待排序表中的元素是隨機的,此時可以取上述最好和最壞情況的平均值作為平均情況下的時間複雜度,總的比較次數與總的移動次數均為約n²/2。
由此,直接插入排序演算法的時間複雜度為o(n²),雖然這般插入排序演算法的時間複雜度也有o(n²),但對於資料量比較小的排序表,折半插入排序往往能表現出很好的效能。
穩定性:由於每次插入元素時總是從後向前先比較再移動,所以不會出現相同元素相對位置發生變化的情況,即直接插入排序是乙個穩定的排序方法。
適用性:直接插入排序演算法適用於順序儲存和鏈式儲存的線性表。當為鏈式儲存時,可以從前往後查詢指定元素的位置。
資料結構 直接插入排序
直接插入排序 include include typedef struct int elem int length sqlist void initsqlist sqlist l int i printf 請輸入元素個數 scanf d l length l elem int malloc size...
資料結構 直接插入排序
直接插入排序 將待插入子串行元素逐步插入到有序序列的執行過程。設有一待排序序列s 其中是有序的,是無序的,要把後面無需的元素,乙個乙個的插入到前面有序的集合中去。如下面的序列可以分為兩個子串行 和 初始序列 75 88 68 92 88 62 77 96 80 72 第一次排序 75 88 68 9...
資料結構 直接插入排序
將乙個記錄插入到已排好序的序列中,從而得到乙個新的有序序列 將序列的第乙個資料看成是乙個有序的子串行,然後從第二個記錄逐個向該有序的子串行進行有序的插入,直至整個序列有序 可以選擇不同的方法在已經排好序資料表中尋找插入位置。根據查詢方法不同,有多種插入排序方法,下面要介紹的是直接插入排序。設待排序的...