希爾排序又稱縮小增量排序。
個人理解其思想是將一組待排序序列分成幾個小組,每個小組採用直接插入排序演算法。假設乙個待排序列有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
2、sort.pp#pragma once
typedef struct nodedatatype;
typedef struct datalist;
class sort
;
#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...