{ temp=r[1];/*将堆顶元素r[1]与最后一个元素交换位置*/ r[1]=r[i];
r[i]=temp;
shift(r,1,i-1);/*将数组元素r[1]到r[i-1]重新调整成为一个新堆*/
}/*FOR*/ }/*HEAP_SORT*/
/*二路归并排序算法如下*/
void merge(rectype *a,rectype *r,int low,int mid,int high) { int i,j,k; i=low;j=mid+1;k=low;
while((i<=mid)&&(j<=high))/*将两个相邻有序子表进行合并*/ { if(a[i].key<=a[j].key)/*取两表中小者复制*/ r[k++]=a[i++]; else r[k++]=a[j++]; }
while(i<=mid) r[k++]=a[i++];/*复制第一个有序子表的剩余记录*/ while(j<=high) r[k++]=a[j++];/*复制第二个有序子表的剩余记录*/ }/*MERGE*/
void merge_pass(rectype *r,rectype *r1,int length) { int i=1,j,n=NUM;
while ((i+2*length-1)<=n)/*归并若干长度为2*length的两个相邻有序子表*/ { merge(r,r1,i,i+length-1,i+2*length-1); i=i+2*length;/*i指向下一对有序子表的起点*/ }
if(i+length-1   merge(r,r1,i,i+length-1,n);/*处理表长不足2*length的部分*/ else for(j=i;j<=n;j++)       r1[j]=r[j];/*将最后一个子表复制到r1中*/ }/*MERGEPASS*/    8  void merge_sort(rectype *r) { int length; rectype r1[MAX];   length=1;/*归并长度从1开始*/  while(length  { merge_pass(r,r1,length);/*一趟归并,结果存放在r1中*/    length=2*length;/*归并后有序表的长度加倍*/     merge_pass(r1,r,length);/*再次归并,结果存放在r中*/    length=2*length;/*再次将归并后有序表的长度加倍*/  }  }/*MERGE_SORT*/   void creat_randnum(int *a )/*产生给定个数和范围的随机整数函数*/ { int i; int range=30000; srand(time(NULL)); for(i=1;i<=NUM;i++)  {a[i]=rand();} /*调用rand生成随机整数*/  printf(\排序前的原始随机整数为:\\n\\n\\t\for(i=1;i<=NUM;i++)  { printf(\输出随机整数*/    if(i==0) printf(\}printf(\}/*CREAT_RANDNUM*/  void create() /*产生NUM个随机整数并保存到记录数组s中*/ { int b[MAX];   int range=30000,i;    creat_randnum(b); /*调用随机整数生成函数,结果存放在数组b中*/   for(i=1;i<=NUM;i++)       s[i].key=b[i];/*将随机整数存放到数组s中*/  9    s1=s;/*s1指向s,以便保存原始数据*/ }/*CREAT*/   void print_record(rectype *r)/*记录数组的输出函数*/ { int i;  printf(\排序后的有序随机整数:\\n\\n\\t\for(i=1;i<=NUM;i++) {printf(\   if(i==0) printf(\}getchar();getchar(); }/*PRINTRECORD*/   int menu_select()/*主菜单选择模块*/ { char c; int kk;  system(\清屏函数*/  printf(\内排序算法的比较----主控模块:\\n\\n\printf(\直接插入排序\\n\printf(\希尔排序\\n\printf(\冒泡排序\\n\printf(\快速排序\\n\printf(\直接选择排序\\n\printf(\堆排序\\n\printf(\二路归并排序\\n\printf(\退出\\n\ do {printf(\请按数位0—7键选择功能:\    c=getchar(); kk=c-48; }while ((kk<0)||(kk)>7); return(kk); }/*MENU_SELECT*/  main()  /*算法比较--主程序模块*/    10  {      double  time1, time2, time3, time4, time5, time6, time7;       clock_t start, finish;   int kk;       do {kk=menu_select(); /*进入主菜单选择模块*/     if(kk!=0) create();    /*建立记录数组*/  switch(kk)   { case 1:{                     case 2:{    start=clock();                           case 3:{    start=clock();                           case 4:{    start=clock();                       case 5:{    start=clock();               start=clock(); insert_sort(s1);  finish=clock();  time1 = (double)(finish - start)/ CLOCKS_PER_SEC ;  printf( \直接插入排序耗时%f seconds\\n\ shell_sort(s1);  finish=clock();  time2 = (double)(finish - start)/ CLOCKS_PER_SEC ; printf( \希尔排序耗时%f seconds\\n\ bubble_sort(s1);  finish=clock();  time3 = (double)(finish - start)/ CLOCKS_PER_SEC ;  printf( \冒泡排序耗时%f seconds\\n\ quick_sort(s1,1,NUM);  finish=clock();  time4 = (double)(finish - start)/ CLOCKS_PER_SEC ;  printf( \快速排序耗时%f seconds\\n\ select_sort(s1);  finish=clock();  11