希尔排序

对《大话数据结构》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过来,不是很理解,欢迎讨论。

posted @ 2016-04-22 23:19  Pearl_zju  阅读(148)  评论(0编辑  收藏  举报