演算法系列 直接插入排序和希爾排序

2021-07-11 04:20:04 字數 1899 閱讀 2272

直接插入排序(insertion sort)的基本思想是:每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。

設陣列為a[0…n-1]。

1)初始時,a[0]自成1個有序區,無序區為a[1..n-1]。令j=1

2)將a[j]併入當前的有序區a[0…j-1]中形成a[0…j]的有序區間。

3)j++並重複第二步直到j==n-1。排序完成。

希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序。

基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量為1)時,再對全體元素進行一次直接插入排序。

以n=10的乙個陣列49, 38, 65, 97, 26, 13, 27, 49, 55, 4為例

第一次 gap = 10 / 2 = 5

49

3865

9726

1327

495541

a1b2a2b

3a3b

4a4b

5a5b

1a,1b,2a,2b等為分組標記,數字相同的表示在同一組,大寫字母表示是該組的第幾個元素, 每次對同一組的資料進行直接插入排序。即分成了五組(49, 13) (38, 27) (65, 49) (97, 55) (26, 4)這樣每組排序後就變成了(13, 49) (27, 38) (49, 65) (55, 97) (4, 26),下同。

第二次 gap = 5 / 2 = 2

13

2749554

4938

6597

261a 1b 1c1

d1e2a 2b 2c2

d2e

第三次 gap = 2 / 2 = 1

4

2613

2738

4949

5597

651a 1b 1c1

d1e1f 1g 1h 1

i1j

第四次 gap = 1 / 2 = 0

4   13   26   27   38    49   49   55   65   97
從1b開始,先和1a比較,然後取2b與2a比較,再取1c與前面自己組內的資料比較…….。即每次從陣列第gap個元素開始,每個元素與自己組內的資料進行直接插入排序。

#include 

using

namespace

std;

void print(int a, int n)

a[i+1]=key;//key>a[i],找到插入位置,將key放在a[i+1]處

}}//希爾排序

void shellsort(int a, int n)

}}int main()

; int a2=;

//int a3=;

int n1=sizeof(a1)/sizeof(a1[0]);

int n2=sizeof(a2)/sizeof(a2[0]);

//int n3=sizeof(a3)/sizeof(a3[0]);

insertsort(a1, n1);

print(a1, n1);

shellsort(a2, n2);

print(a2, n2);

return

0;}

排序演算法系列 直接插入排序(C )

直接插入排序的基本操作是將乙個記錄插入到已經排好序的有序表中,從而得到乙個新的 記錄數增加1的有序表。這是直插排序的操作定義。參考 大話資料結構 這本書的實現原理,c 如下 include define size 10 using namespace std void insert sort int...

演算法 排序 插入排序(直接插入和希爾排序)

這裡介紹兩種插入排序演算法 1 直接插入排序 2 希爾排序 基本思想 1 直接插入排序 直接插入排序即從資料第二個數開始進行比較,當它比前乙個值小時,將它不斷向前移動,知道它的值不再比它前面的值大,被他超過的值依次向後移動一位,如此反覆,知道最後乙個數排序完畢,即可得到排序後的序列。插入排序與打撲克...

直接插入排序和希爾排序

if defined insertsort h define insertsort h include define maxsize 100 typedef int keytype 關鍵字型別用來比較 typedef char infotype 其他型別的資訊 typedef structrecty...