我是靠谱客的博主 仁爱毛豆,这篇文章主要介绍插入排序—希尔排序,现在分享给大家,希望可以做个参考。

排序思路

希尔排序是一种分组插入排序。先取定一个小于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,d_{i+1}=left lfloor d_{i}/2 right rfloor

复制代码
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。希尔排序算法的时间复杂度难以分析,一般认为其平均时间复杂度为O(n^{1.3})

希尔排序优于直接插入排序的原因:对于直接插入排序有两点可以提升性能

  • 如果直接插入排序的初态基本有序时,直接插入排序比较和移动的次数较少
  • 当n的值较小时,n和n^{2}差别也较小。

希尔排序通过分组,使开始排序每组内直接插入排序的n比较小,满足第二条;到后面增量减小,组内n增大后,组内元素已经接近有序状态。满足第一条

希尔排序是一种不稳定的排序算法。

最后

以上就是仁爱毛豆最近收集整理的关于插入排序—希尔排序的全部内容,更多相关插入排序—希尔排序内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部