排序思路
希尔排序是一种分组插入排序。先取定一个小于n的整数d1作为第一个增量,把表全部元素分成d1个组,所有相互之间距离为d1的倍数的元素放在一个组内。在各组之间进行插入排序;然后再取第二个增量d2(d2<d1)重复分组和排序的过程,直至所取的增量dt=1(dt<d(t-1)<……<d2<d1)。
举例:对于数组int a[10]={9,8,7,6,5,4,3,2,1,0};
d1=10/2=5
{9,4},{8,3},{7,2},{6,1},{5,0}
代码实现
取d1=n/2,
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#include <iostream> using namespace std; void shellSort(int a[],int n) { int gap,tmp,j,i;//gap代变每次取的增量 gap=n/2; while(gap>0)//gap最小为1 { //就是直接插入方法,只是这里gap作为间距 for(i=gap; i<n; i++) { tmp=a[i]; j=i-gap; while(j>=0&&tmp<a[j]){ a[j+gap]=a[j]; j=j-gap; } a[j+gap]=tmp; } gap=gap/2; } } int main() { int a[]={9,8,7,6,5,4,3,2,1,0}; shellSort(a,10); for(int i=0;i<10;i++){ cout << a[i]<<","; } cout<< endl; return 0; }
算法分析
目前希尔排序的增量选区没有定论,但是保证最后一个增量必须等于1。希尔排序算法的时间复杂度难以分析,一般认为其平均时间复杂度为
希尔排序优于直接插入排序的原因:对于直接插入排序有两点可以提升性能
- 如果直接插入排序的初态基本有序时,直接插入排序比较和移动的次数较少
- 当n的值较小时,n和
差别也较小。
希尔排序通过分组,使开始排序每组内直接插入排序的n比较小,满足第二条;到后面增量减小,组内n增大后,组内元素已经接近有序状态。满足第一条
希尔排序是一种不稳定的排序算法。
最后
以上就是仁爱毛豆最近收集整理的关于插入排序—希尔排序的全部内容,更多相关插入排序—希尔排序内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复