插入排序和希爾排序

2021-10-09 04:58:21 字數 3201 閱讀 5957

希爾排序**

十種排序方法

直接插入排序

折半插入排序

直接插入排序

直接插入排序(straight insertion sort)是一種最簡單的排序方法,其基本操作是將一條記錄插入到已經排序號的有序表中,從而得到乙個新的,記錄數量增1的有序表

排序方法

1、簡單方法

首先在當前有序區r[1…i-1]中查詢r[i]的正確插入位置k(1≤k≤i-1);然後將r[k..i-1]中的記錄均後移乙個位置,騰出k位置上的空間插入r[i]。

注意:若r[i]的關鍵字大於等於r[1..i-1]中所有記錄的關鍵字,則r[i]就是插入原位置。

2.改進的方法

一種查詢比較操作和記錄移動操作交替地進行的方法。具體做法:

將待插入記錄r[i]的關鍵字從右向左依次與有序區中記錄rj的關鍵字進行比較:

① 若r[j]的關鍵字大於r[i]的關鍵字,則將r[j]後移乙個位置;

②若r[j]的關鍵字小於或等於r[i]的關鍵字,則查詢過程結束,j+1即為r[i]的插入位置。

關鍵字比r[i]的關鍵字大的記錄均已後移,所以j+1的位置已經騰空,只要將r[i]直接插入此位置即可完成一趟直接插入排序。

哨兵的作用

演算法中引進的附加記錄r[0]稱監視哨或哨兵(sentinel)。

哨兵有兩個作用:

① 進人查詢(插入位置)迴圈之前,它儲存了r[i]的副本,使不致於因記錄後移而丟失r[i]的內容;

② 它的主要作用是:在查詢迴圈中"監視"下標變數j是否越界。一旦越界(即j=0),因為r[0].可以和自己比較,迴圈判定條件不成立使得查詢迴圈結束,從而避免了在該迴圈內的每一次均要檢測j是否越界(即省略了迴圈判定條件"j>=1")。

注意:① 實際上,一切為簡化邊界條件而引入的附加結點(元素)均可稱為哨兵。

【例】單鏈表中的頭結點實際上是乙個哨兵

② 引入哨兵後使得測試查詢迴圈條件的時間大約減少了一半,所以對於記錄數較大的檔案節約的時間就相當可觀。對於類似於排序這樣使用頻率非常高的演算法,要盡可能地減少其執行時間。所以不能把上述演算法中的哨兵視為雕蟲小技,而應該深刻理解並掌握這種技巧。

複製**

#include

#include

#define l 8

void

pri_sort

(int

*a,int l)

}int

main()

;for

(i =

2; i < l; i++

) sortn[j +1]

= sortn[0]

;}pri_sort

(sortn,l)

;system

("pause");

}

演算法分析(1)時間複雜度

從時間看來,排序的基本操作為:比較兩個關鍵字的大小和移動記錄。最好的情況是:正序:待排序中記錄按關鍵字非遞減有序排列 比較一次不移動。最壞的情況是:逆序:待排序序列中記錄按關鍵字非遞增有序排列 比較i次(依次同前面的i-1個記錄進行比較,並和哨兵比較1次,移動i+1次(前面的i-1次個記錄一次向後移動,另外開始時將待插入的記錄移動到監視哨中,最後找到插入位置,又從監視哨中移過去。

折半插入排序

直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中的插入位置,這個查詢操作可利用折半查詢來實現,由此進行的插入排序稱之為這般插入排序

演算法步驟

1.待排序的記錄存放在陣列r[1…n]中,r[1]是乙個有序序列。

2.迴圈n-1次,每次使用折半查詢法,查詢[i](i=2,3,4,5.。。n)在已排好序的序列r[1,…i-1]中的插入位置,然後將r[i]插入表長為i-1的有序序列r[1…i-1],直到將r[n]插入表長為n-1的有序序列中,最後得到乙個表長為n的有序序列。

void

binsersort

(sqlist &l)

for(j=i-

1;j>=high+

1;j--

)//記錄後移

l.r[high+1]

=l.r[0]

;//將r[0]即原來的r[i]插入到正確的位置

}

演算法分析(1)時間複雜度

(2)空間複雜度

折半插入排序所需附加儲存空間和直接排序相同,只需要乙個記錄的輔助空間r[0],所以空間複雜度為o(1)。

演算法特點

1.穩定排序

2.因為要進行折半查詢,所以只能用於順序結構,不能用於鏈式結構。

2適合初始記錄無序,n較大時的情況。

應用場景:小規模資料,基本有序的資料

演算法實現:希爾排序需要定義乙個增量,這裡選擇增量為gap=length/2,縮小增量以gap=gap/2的方式,這個增量可以用乙個序列來表示,,稱為增量序列,這個增量是比較常用的,也是希爾建議的增量,稱為希爾增量,但其實這個增量序列不是最優的。

}跳躍性插入,希爾排序屬於不穩定排序

插入排序和希爾排序

插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,插入排序的基本思想是 每步將乙個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。public static void sortins...

插入排序和希爾排序

1.首先,排序按類來分有插入排序 選擇排序 交換排序和歸併排序,而插入排序又分為直接插入排序和希爾 shell 排序 選擇排序類又分為選擇排序和堆排序,交換排序分為氣泡排序和快速排序,今天主要分享插入排序和希爾排序。2.插入排序概念 插入排序 對乙個陣列中的數,比較大小,假設它是公升序排列,認為它的...

插入排序和希爾排序

author shenqi date 2018 1 15.插入排序 每步將乙個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置 從後向前找到合適位置後 直到全部插入排序完為止。從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 ...