标签:
对《大话数据结构》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