/* *1. 编写一个希尔排序的算法,并且在main函数中验证其功能已实现 *希尔排序(Shell's Method)又称“缩小增量排序”,它的基本方法是: *将排序表分成若干组,所有相隔为某个“增量”的记录为一组,在各组内 *进行直接排序;初始时增量d1较大,分组越多(每组的记录数少),以后 *增量逐渐减少,分组减少(每组的记录数增多),直到最后增量为1,所有 *记录放为同一组,怎整体进行一次直接插入排序 *下面一个具体例子。取排序表如下,增量序列取为5,3,1 *排序过程如下: 1 2 3 4 5 6 7 8 *初始关键字: 49 38 65 97 76 13 27 49' d1=5 49 13 间隔是5 38 27 分为5组 65 49' 97 76 *第一趟结果: 13 27 49' 97 76 49 38 65 d2=3 13 97 38 间隔是3 27 76 65 分为3组 49' 49 *第二躺结果: 13 27 49 38 65 49 97 76 *第三趟结果: 13 27 38 49' 49 65 76 97 (直接插入排序) 显然,若一开始就取增量为1,则希尔排序就是直接插入排序了 希尔排序的增量的取法是:d1=(n/2)向下取整,d(i+1)=di/2向下去整,dt=1,t=log2n向下去整 */ #include<iostream> using namespace std; const int maxsize=100; //排序表容量 typedef int datatype; typedef struct { datatype key; //关键字域 } rectype; //记录类型 typedef rectype list[maxsize+1]; //排序表类型,0号单元不用 //若不设监视哨,则每趟插入排序算法如下: void ShellInsert( list R,int n,int h) //一趟插入排序,h为本趟增量 { int i,j,k; //i为组号 for(i=1;i<=h;i++) { for(j=i+h;j<=n;j+=h) { //R[j]大于有序区最后一个记录,则不需要插入 if(R[j].key>=R[j-h].key) continue; R[0]=R[j]; //R[0]保存待插记录,但不是监视哨 k=j-h; do //查找正确的插入位置 { R[k+h]=R[k]; //后移记录,继续向前搜索 k=k-h; } while(k>0 && R[0].key<R[k].key); R[k+h]=R[0]; //插入R[j] } } for(i=1;i<=n;i++) cout<<R[i].key<<" "; cout<<endl; } //希尔排序过程就是调用若干趟插入排序,主算法如下: void ShellSort(list R,int n,int d[],int t)//d[]为增量序列,t为增量序列长度 { int i; for(i=0;i<t;i++) ShellInsert(R,n,d[i]); //各趟插入排序 } //主函数实现希尔排序功能 int main() { list R; //定义排序表 const int n=8; //定义排序表长度 int d[3]={5,3,1}; cout<<" 欢迎来到希尔排序功能调试界面!!!!!! "<<endl; cout<<"------------请输入你要排序的续表-----------------"<<endl; for(int i=1;i<=n;i++) cin>>R[i].key; cout<<endl; cout<<"排序表初始序列:"<<endl; for(int i=1;i<=n;i++) cout<<R[i].key<<" "; cout<<endl; cout<<"惊喜就在后面,看看现在的排序表是否已经是有序表"<<endl; ShellSort(R,n,d,3); for(int i=1;i<=n;i++) cout<<R[i].key<<" "; cout<<endl; system("pause"); return 0; }
posted on 2011-12-02 20:08 1.曲待续 阅读(1676) 评论(0) 编辑 收藏 举报