林中 鸟 在线 试听:这段程序应该如何改?

来源:百度文库 编辑:神马品牌网 时间:2024/05/12 04:33:16
随机生成20个整数,分别应用直接插入排序和希尔排序输出排序结果。
运行结果直接排序正确,而希尔排序不对,请教怎样改?谢谢~

#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>
#include<time.h>
#define MAXI 21
typedef int KeyType;
typedef int ElemType;
struct rec
{
KeyType key;
ElemType data;

};
typedef rec sqlist[MAXI];
void insertsort(sqlist b,int n) //直接插入排序
{
int i,j,k;
for(i=2;i<n;i++)
{
b[0]=b[i];
j=i-1;
while(b[0].key<b[j].key)
{
b[j+1]=b[j];j--;
}
b[j+1]=b[0];
for(k=1;k<n;k++)
cout<<setw(4)<<b[k].key;
cout<<endl;
}
}

typedef rec sqlist[MAXI]; //希尔排序
void shellsort(sqlist b,int n)
{
int i,j,gap,k; rec x;
gap=n/2;
while(gap>0)
{
for(i=gap+1;i<n;i++)
{
j=i-gap;
while(j>0)
if(b[j].key>b[j+gap].key)
{
x=b[j];b[j]=b[j+gap];
b[j+gap]=x;j=j-gap;
}
else j=0;
for(k=1;k<n;k++)
cout<<setw(4)<<b[k].key;
cout<<endl;
}
gap=gap/2;
}
}

void main()
{
cout<<"直接插入排序运行结果:\n"; //直接排序输出
sqlist a,l; int i,n=MAXI;
srand(time(0));
for(i=1;i<n;i++)
{
a[i].key=rand()%80;
a[i].data=rand()%100;

}
for(i=1;i<=20;i++) l[i]=a[i];
cout<<"排序前数组:\n";
for(i=1;i<n;i++)
cout<<setw(4)<<a[i].key;
cout<<endl;
cout<<"直接插入排序过程演示:\n";
insertsort(a,n);
cout<<"直接插入排序后数组:\n";
for(i=1;i<n;i++)
cout<<setw(4)<<a[i].key;
cout<<endl;
cin.get();

cout<<"希尔排序运行结果:\n"; //希尔排序输出
sqlist x;int z,y=MAXI;
for(i=1;i<n;i++)
{
a[i].key=rand()%80;
a[i].data=rand()%100;

}
cout<<"排序前数组:\n";
for(i=1;i<=n;i++)
cout<<setw(4)<<a[i].key;
cout<<endl;
cout<<"希尔排序过程演示:\n";
shellsort(l,y);
cout<<"希尔排序后数组:\n";
for(z=1;z<y;z++)
cout<<setw(4)<<l[z].key;
cout<<endl;
cin.get();
}

参考答案:读书是易事,思索是难事,但两者缺一,便全无用处。——富兰克林

数据结构的教材上有源程序