【正确答案】/*在以下所有的排序算法中,待排序数据均放在r[0]到r[n-1]单元中*/
#define KEYTYPE int /*顺序表的类型定义*/
#define MAXSIZE 100
typedef struct
{KEYTYPE key;
}RECORDNODE;
void gaosort(RECORDNODE*r,int n) /*设立高端监视哨的直接插入排序算法*/
{ int i,j;
for(i=n-2;i>=0;i--)
{ r[n]=r[i];
j=i+1;
while(r[n].key>r[j].key)
{ r[j-1]=r[j];
j++;
}
r[j-1]=r[n];
}
}
void maosort(RECORDNODE*r,int n) /*自下向上扫描的冒泡排序算法*/
{RECORDNODE temp;
int i,j,noswap;
for(i=0;i<n-1;i++)
{ noswap=1;
for(j=n-2;j>=i;j--)
if(r[j].key>r[j+1].key)
{temp=r[j];r[j]=r[j+1];r[j+1]=temp;noswap=0;}
if(noswap)
break;
}
}
void xuansort(RECORDNODE*r,int n) /*直接选择排序算法*/
{ RECORDNODE temp;
int i,j,k;
for(i=0* i<n-1* i++)
{ k=i*
for(j=i+1;j<=n-1; j++)
if(r[j].key<r[k].key)
k=j;
if(k!=i)
{temp=r[i];r[i]=r[k];r[k]=temp;}
}
}
int part(RECORDNODE*r,int*low,int*high) /*-趟快速排序算法*/
{ int i,j;
RECORDNODE temp;
i=*low;j=*high;
temp=r[i];
do{while(r[j].key>=temp.key&&i<j)
j--;
if(i<j)
{r[i]=r[j];i++;}
while(r[i].key<=temp.key&&i<j)
i++;
if(i<j)
{r[j]=r[i];j--;}
}while(i!=j);
r[i]=temp;
return i;
}
void quicksort(RECORDNODE*r,int start,int end) /*快速排序算法*/
{int i;
if(start<end)
{ i=part(r,&start,&end);
quicksort(r,start,i-1);
quicksort(r,i+1,end);
}
}
void paixuhou(RECORDNODE*r,int n)
{ int i;
printf("排序后:");
for(i=0;i<n;i++) /*输出排序后的有序序列*/
printf("/%4d",r[i].key);
}
main()
{ RECORDNODE r[MAXSIZE];
int i,len,start=0;
int haoma,flag=1;
scanf("/%d",&len);
for(i=0;i<len;i++)
scanf("/%d",&r[i].key);
while(flag)
(printf("排序综合练习\n");
printf("1.直接插入排序\n"); /*系统菜单*/
printf("2.冒泡排序\n");
printf("3.直接选择排序\n");
printf("4.快速排序\n");
printf("0.退出\n");
printf("input:");
scanf("/%d",&haoma); /*输入菜单选项值*/
if(haoma>=0&&haoma<=4) /*确定输入的号码在0到4之间*/
switch(haoma) /*根据输入的haoma值,调用不同的排序算法*/
{ case 1:gaosort(r,len);paixuhou(r,len);break;
case 2:maosort(r,len); paixuhou(r,len);break;
case 3:xuansort(r,len); paixuhou(r,len);break;
case 4:quicksort(r,start,len-1);paixuhou(r,en); break;
case 0:flag=0; break;
}
printf("结束此练习吗?(0-结束,1-继续)");
scanf("/%d",&flag);
}
}
【答案解析】