码迷,mamicode.com
首页 > 编程语言 > 详细

希尔排序

时间:2016-04-22 23:54:39      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

对《大话数据结构》P389~P396—希尔排序,进行了自己的理解并完善了代码。

技术分享

代码和解释如下(VS2012测试通过):

 1 #include <iostream>
 2 using namespace std;
 3 #define MAXSIZE 9//用于要排序数组个数最大值,可根据需要修改
 4 
 5 //排序用的顺序表结构
 6 typedef struct
 7 {
 8     int r[MAXSIZE+1];//定义一个数组,用于存储要排序的数,r[0]作为临时变量
 9     int length;//用于记录顺序表的长度
10 }SqList;
11 
12 //排序表的初始化
13 SqList *InitSqList(SqList *L)
14 {
15     L=new SqList;
16     L->length=MAXSIZE;//本例中长度是9
17     cout<<"input list"<<endl;
18     for(int i=1;i<=L->length;i++)
19         cin>>L->r[i];
20     return L;
21 }
22 
23 //数组遍历输出
24 void PrintSqList(SqList *L)
25 {
26     for(int i=1;i<=L->length;i++)
27         cout<<L->r[i]<<" ";
28     cout<<endl;
29 }
30 
31 //希尔排序
32 void ShellSort(SqList *L)
33 {
34     int i,j,k=0;
35     int increment=L->length;//这是希尔排序的精华,将相隔某个增量的数组成子序列
36     do
37     {
38         increment=increment/3+1;//增量选取是个难题,注意最后一个增量值必须等于1
39         //每次循环结束后,相隔某个增量的数组成子序列必是顺序排列
40         for(i=increment+1;i<=L->length;i++)
41         {
42             if (L->r[i]<L->r[i-increment])//相隔增量的某两个数比大小
43             { 
44                 L->r[0]=L->r[i];//把r[i]挪到哨兵位置
45                 for(j=i-increment;j>0 && L->r[0]<L->r[j];j-=increment)//决定r[i]插入到哪个位置
46                     L->r[j+increment]=L->r[j]; //把r[i]插入到合适的位置,不一定只减去一个增量,有可能是两个,三个...
47                 L->r[j+increment]=L->r[0]; //把哨兵位置的数插入到合适位置,不一定只与r[i]的相隔一个增量值
48             }
49         }
50         cout<<++k<<"times ";
51         PrintSqList(L);
52     }
53     while(increment>1);
54 }
55 
56 int main()
57 {
58     SqList *p=NULL;
59     p=InitSqList(p);//初始化
60     ShellSort(p);//排序
61     cout<<"after sort"<<endl;
62     PrintSqList(p);//输出
63 }

运行结果:

技术分享

关于时间复杂度的分析,直接把书上的内容copy过来,不是很理解,欢迎讨论。

技术分享

技术分享

希尔排序

标签:

原文地址:http://www.cnblogs.com/hslzju/p/5423195.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!