- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <math.h>
- #include <windows.h>
- void delay() //延迟函数
- {
- long i,k ;
- for(i=0; i<50000; i++)
- for(k=0; k<2000; k++);
- }
- void color_change()
- {
- int i ;
- for(i=0; i<5; i++)
- {
- system("color A0");
- delay();
- system("color D9");
- delay();
- system("color 9F");
- delay();
- system("color 0A");
- }
- } //程序启动窗口颜色变换
- void loading()
- {
- printf("\\n\\n\\n\\n\\n\\n\\n\\t\\t\\t********************\\n");
- printf("\\t\\t\\t** 评测程序载入中 **\\n");
- printf("\\t\\t\\t********************");
- color_change();
- system("cls");
- }
- void welcome()
- {
- printf("\\n\\a***********排序程序评测*************\\n");
- printf("************************************\\n");
- printf("*********** 1.交换排序 *************\\n");
- printf("*********** 2.冒泡排序 *************\\n");
- printf("*********** 3.插入排序 *************\\n");
- printf("*********** 4.希尔排序 *************\\n");
- printf("************************************\\n");
- printf("************************************\\n");
- printf(" --Writed by Oliver\\n");
- } //功能界面
- void print_NUM()
- {
- printf("************************************\\n");
- printf("***********请输入数字数量***********\\n");
- printf("************************************\\n");
- }
- long input_NUM()
- {
- long num;
- scanf("%d",&num);
- return(num);
- }
- void writefile(long x[],long n,int cs,int fs_num)
- {
- FILE*fp ;
- long i ;
- char fs[4][20]=
- {
- "交换排序","冒泡排序","插入排序","希尔排序"
- }
- ;
- if((fp=fopen("d:\\\\data.txt","a"))==NULL)
- printf("打开文件失败!\\n");
- else
- {
- fprintf(fp,"当前排序方式:%s\\n",fs[fs_num-1]);
- fprintf(fp,"数据总量:%ld\\n",n);
- {
- fprintf(fp,"第 %d 组随机数:\\n",cs);
- for(i=0; i<n; i++)
- {
- fprintf(fp,"%6d",x[i]);
- }
- fprintf(fp,"\\n");
- }
- }
- fclose(fp);
- printf("**********当前数据数量%d个*********\\n",i);
- } //写入文件
- void write_data(long x[],long n,int px,long kk)
- {
- FILE*fp ;
- long i ;
- if((fp=fopen("d:\\\\data.txt","a"))==NULL)
- printf("打开文件失败!\\n");
- else
- {
- fprintf(fp,"第 %d 组排序:\\n ",px);
- for(i=0; i<n; i++)
- {
- fprintf(fp,"%6d",x[i]);
- }
- fprintf(fp,"\\n");
- fprintf(fp,"*************************\\n");
- fprintf(fp,"所用时间:%ldms\\n\\n",kk);
- }
- fclose(fp);
- } //写入排序结果到文件
- long fun_1(long b[],long x)
- {
- long start,end ;
- long i,t,k,c,j ;
- start=clock();
- for(i=0; i<x-1; i++)
- {
- k=i ;
- for(j=i+1; j<x; j++)
- if(b[k]<b[j])
- k=j ;
- if(k!=i)
- {
- c=b[k];
- b[k]=b[i];
- b[i]=c ;
- }
- }
- end=clock();
- for(i=0; i<x; i++)
- printf("%ld\\n",b[i]);
- printf("************************************\\n");
- printf("数字个数:%d\\n开始时间:%dms\\n结束时间:%dms\\n",i,start,end);
- return(end-start);
- } //交换排序
- long fun_2(long c[],long n)
- {
- long i,j,temp ;
- long start,end ;
- start=clock();
- for(j=0; j<n-1; j++)
- for(i=0; i<n-1-j; i++)
- if(c[i]>c[i+1])
- {
- temp=c[i];
- c[i]=c[i+1];
- c[i+1]=temp ;
- }
- end=clock();
- for(i=0; i<n; i++)
- printf("%ld\\n",c[i]);
- printf("************************************\\n");
- printf("数字个数:%d\\n开始时间:%dms\\n结束时间:%dms\\n",i,start,end);
- return(end-start);
- } //冒泡排序
- long fun_3(long b[],long x)
- {
- long i,j,k,temp ;
- long start,end ;
- start=clock();
- for(i=1; i<x; i++)
- {
- temp=b[i];
- for(j=i-1; j>=0&&temp>b[j]; j--)
- b[j+1]=b[j];
- b[j+1]=temp ;
- }
- end=clock();
- for(i=0; i<x; i++)
- printf("%ld\\n",b[i]);
- printf("************************************\\n");
- printf("数字个数:%d\\n开始时间:%dms\\n结束时间:%dms\\n",i,start,end);
- return(end-start);
- } //插入排序
- long fun_4(long a[],long n)
- {
- long d=n/2 ;
- long i,j,temp ;
- long start,end ;
- start=clock();
- for(d; d>=1;)
- {
- for(i=d; i<n; i++)
- {
- temp=a[i];
- j=i-d ;
- while(j>=0&&a[j]>temp)
- {
- a[j+d]=a[j];
- j=j-d ;
- }
- a[j+d]=temp ;
- }
- d=d/2 ;
- }
- end=clock();
- for(i=0; i<n; i++)
- printf("%ld\\n",a[i]);
- printf("************************************\\n");
- printf("数字个数:%d\\n开始时间:%dms\\n结束时间:%dms\\n",i,start,end);
- return(end-start);
- } //插入排序
- void main()
- {
- long k,m ,NUM;
- long order,array[250000],rec[10];
- char input,quit ;
- float sum=0.0 ;
- loading();
- loop :
- welcome();
- printf("\\n******请输入你的选择(按0退出)*******\\n");
- scanf("%d",&input);
- if(input==0) goto quit;
- if(input!=1&&input!=2&&input!=3&&input!=4) goto wrong;
- system("cls"); //输入功能
- print_NUM();
- NUM=input_NUM();
- m=0 ;
- while(m<8) //循环8次,方便记录数据
- {
- for(order=0; order<NUM; order++)
- array[order]=(long)rand(); //生成8组不同随机数
- writefile(array,NUM,m+1,input); //写入8组不同随机数
- switch(input)
- {
- case 1 :
- k=fun_1(array,NUM);
- printf("交换排序所用时间:%dms\\n",k);
- printf("************************************\\n");
- break ;
- case 2 :
- k=fun_2(array,NUM);
- printf("冒泡排序所用时间:%dms\\n",k);
- printf("************************************\\n");
- break ;
- case 3 :
- k=fun_3(array,NUM);
- printf("插入排序所用时间:%dms\\n",k);
- printf("************************************\\n");
- break ;
- case 4 :
- k=fun_4(array,NUM);
- printf("希尔排序所用时间:%dms\\n",k);
- printf("************************************\\n");
- break ;
- default :
- wrong:
- system("cls");
- printf("\\n********输入错误,请重新输入********\\n");
- goto loop ;
- }
- write_data(array,NUM,m+1,k); //写入结果到文件
- rec[m]=k ; //将时间平均值存入数组
- m++;
- }
- for(m=0; m<8; m++)
- {
- printf("%4d ",rec[m]);
- sum=sum+rec[m];
- } //计算8次时间的和
- printf("\\n\\a%d个数字8次排序的平均时间为 %.2fms\\n\\n",NUM,sum/8);
- LOOP:
- printf("************ 继续?(Y/N)************\\n");
- char key2=getch();
- if(key2=='Y'||key2=='y')
- {
- system("cls");
- goto loop;
- }
- else if(key2=='N'||key2=='n') goto quit;
- else
- {
- printf("\\a\\n\\n********输入错误,请重新输入********\\n\\n");
- goto LOOP;
- }
- //goto loop ; //跳转到输入界面重新选择
- quit :
- system("exit"); //退出系统命令
- }
- //该片段来自于http://www.codesnippet.cn/detail/2801201511680.html
来源: http://www.codesnippet.cn/detail/2801201511680.html