问答题 排序
   实验目的:
   (1)熟练掌握在顺序表上实现排序的各种方法。
   (2)深刻理解各种排序方法的特点,并能灵活运用。
   (3)掌握和理解本实验中出现的一些基本的C语言语句。
   (4)体会算法在程序设计中的重要性。
   实验内容:
   编写一个排序菜单程序,在其中调用不同的排序算法,实现对任意无序序列的递增排序操作。在主程序中输入初始序列,分别调用直接插入排序、冒泡排序、直接选择排序、快速排序等排序算法,输出排序后的结果。题目要求:在所有的排序算法中,待排序数据均从数组的0单元放起。
【正确答案】/*在以下所有的排序算法中,待排序数据均放在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);
           }
   }
【答案解析】