问答题 已知有8个整数:1,7,3,2,0,5,6,8,分别用下列方法进行排序,编写程序。
   (1)直接插入排序;
   (2)折半插入排序;
   (3)希尔排序。
【正确答案】算法由主函数和直接插入排序、折半插入排序、希尔排序、输出五个函数组成。
   程序如下:
   #include<stdio.h>
   #define LENGTH 8
   void InsertSort(int r[],int n)    /*直接插入排序*/
   {
     inti,j;
   for(i=2;i<n;++i)    /*认为第一个数有序,i从2开始*/
     if(r[i]<r[i-1])    /*若小于,将r[i]插入有序序列中*/
     {
       r[0]=r[i];    /*r[i]的值放入监视哨中*/
       for(j=i-1;r[0]<r[j];--j)
          r[j+1]=r[j];    /*记录后移*/
       r[j+1]=r[0];    /*插入到正确位置*/
     }
   printdata(r,n);
 }
 void BinSort(int r[],int n)    /*折半插入排序*/
 {
   int i,J,low,high,m;    /*定义变量,其中low,high表示查找的上下界*/
   for(i=2;i<n;++i)    /*认为第一个数有序,i从2开始*/
   {
     r[0]=r[i];    /*将r[i]暂时存入r[0]中*/
     low=1;
     high=i-1;    /*置有序序列区间的初值*/
     while(low<=high)    /*从r[low]到r[high]折半查找插入位置*/
     {
       m=(low+high)/2;    /*折半,取中间位置送m*/
       if(r[0]<r[m])
         high=m-1;    /*插入位置在低半区*/
       else
         low=m+1;    /*插入位置在高半区*/
   }
   for(j=i-1;j>=high+1;--j)
     r[j+1]=r[j];    /*插入位置以后的记录后移*/
   r[high+1]=r[0];    /*插入记录*/
  }
  printdata(r,n);
 }
 void ShellSort(int r[],int n)    /*希尔排序*/
 {
   int i,J,d;
   d=n/2;    /*取第一个步长值*/
   while(d>=1)    /*步长d>=1*/
   {
     for(i=d;i<n;i++)    /*对每组进行直接插入排序*/
     {
      r[0]=r[i];    /*记录r[i]暂存入r[0]中*/
   j=i-d:    /*确定每组中的记录r[i]前一个位置*/
   while((j>0)&&(r[0]<r[j]))    /*在组中查找插入位置*/
   {
     r[j+d]=r[j];    /*记录后移*/
     j=j-d;    /*记录位置前移一个步长*/
   }
   r[j+d]=r[0];    /*插入记录*/
 }
 d=d/2;    /*缩小步长值*/
}
printdata(r,n);
}
void printdata(int r[],int n)
{
   int i;
   for(i=1;i<n;i++)
   printf("/%d",r[i]);
}
main()    /*主程序*/
{
   int r[LENGTH+1]={0,1,7,3,2,0,5,6,8};/*定义数组并赋初值*/
   int r1[LENGTH+1];    /*暂用数组*/
   int i,n=LENGTH+1;
   for(i=0;i<=LENGTH;i++)    /*复制数组*/
     r1[i]=r[i];
   printf("\nlnsertSort output:");
   InsertSort(r1,n);    /*直接插入排序并输出*/
   for(i=0;i<LENGTH;i++)    /*复制数组*/
     r1[i]=r[i];
   printf("\nBinSort output:");
   BinSort(r1,n);    /*折半插入排序并输出*/
   for(i=0;i<LENGTH;i++)    /*复制数组*/
     r1[i]=r[i];
   printff("\nShellSort output:");
   ShellSort(r1,n);    /*希尔排序并输出*/
  }
   输出结果为:
   InsertSort output:0 1 2 3 5 6 7 8
   BinSort output:0 1 2 3 5 6 7 8
   SheliSort output:0 1 2 3 5 6 7 8
【答案解析】