排序演算法 C 三)插入排序之希爾排序

2021-07-04 14:55:23 字數 1972 閱讀 2802

希爾排序又稱縮小增量排序。

個人理解其思想是將一組待排序序列分成幾個小組,每個小組採用直接插入排序演算法。假設乙個待排序列有n個元素,找到乙個整數gap(gap

gap的取值習慣取序列元素個數的一半,然後每次減半,直到gap=1,變成直接插入排序。          

i        

0     

1    

2     3      

4      

5     

6     

7                     

初始序列 

21  

25  

49    

25*  

16     

8    

62   38

n = 8 gap = n/2 = 4;

gap是4,序列分成四組分別是,,,,下面用不同顏色標註不同的序列。

對這四組使用直接插入演算法得到,,,

i      

0     

1    

2     

3     

4    

5     

6    7

第一趟 

16    

8   

49   

25*  

21  

25   

62  38

gap = gap/2 gap=2;

gap是2,序列分成2組,, .分別使用直接插入排序。排序結果,

i      

0     

1    

2     

3      

4     

5      

6     

7第二趟  

16    

8   

21   

25*   

49  

25    

62  38

gap = gap/2 gap = 1;

gap是1,此時希爾排序淪為直接插入排序。

i      0    1    2     3     4     5     6    7

第三趟 

8  16   

21  

25*  

25   

38   

49   62

本質上還是直接插入排序,

但它這種分隔排序確實比直接插入排序效率高,雖然最後是直接插入排序,但經過前幾次的排序,此時大

多數元素都是有序的。比較適合較大規模的序列(n<=1000).

1、sort.h

#pragma once

typedef struct nodedatatype;

typedef struct datalist;

class sort

;

2、sort.pp

#include "stdafx.h"

#include "sort.h"

sort::sort(void)

sort::~sort(void)

void sort::shellsort( datalist &l , int d, int m) }}

void sort::shellinsertsort( datalist &l,int start, int gap )

l.elem[j+gap] = temp;

} }}

分析:

最好情況:比較次數o(n^1.25),移動次數0次(我一直認為最好情況是指序列是有序的,此時不用移動元素。移動次數應該為0,但書上卻說是o(n^1.25),個人感覺它指的是平均移動次數。)

最壞情況:比較次數n^1.5,移動次數o(n^2)沒找到資料。

平均時間複雜度是o(n^1.5)

不穩定排序

排序演算法 插入排序 希爾排序

1 相鄰資料之間相比較。先是1,0 然後2,1 1,0 以此類推 總結 大for從1 n 小for從i 0,之後判斷交換即可 public void charusort for int i 1 i a.length i 2 希爾排序是插入排序特殊化,他不再比相鄰資料,而是可以比較類似1,4,13.的...

插入排序演算法 希爾排序

插入排序演算法 希爾排序 希爾排序思想是將陣列每次分成不同的陣列同時進行排序,劃分的方式是設定增量值,即h length 2,h 2 與直接排序最大的不同就是比較的陣列值下標間隔不同。希爾排序在資料量龐大的時候進行排序效率高,時間短。觀察下圖,根據以上思想,進行移動。如下 include void ...

插入排序之希爾排序

希爾排序也屬於插入類排序演算法。希爾排序通過縮小增量,將待排序元素劃分為若干個子串行,分別對各個子串行按照直接按照插入排序演算法進行排序。當增量為1時,待排序元素構成乙個子串行,對該序列排序完畢後希爾排序演算法結束。如下 include void shellsort int a,int length...