题目1:利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。
要求:1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。
并把排序后的结果保存在不同的文件中。
2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。
代码如下:#include <stdio.h>//标准输入输出头文件#include <stdlib.h>//定义杂项函数及内存分配函数#include <string.h> //字符串处理#include <time.h>//定义关于时间的函数#define N 20000clock_t Start,Now;//时钟void Wrong()//错误输出{printf("\n*****按键错误!请重新输入*****\n");getchar();//从标准输入获取字符并返回下一个字符}void change(int a[])//十个一行输出{int i;system("cls");//清除之前的操作for(i=0;i<N;i++){if((i-1)==9)printf("\n");printf("%-7d",a[i]);}}//二分插入排序void Sort_efcr (int a[],int p){int t,i,j,low,high,mid;for(i=2;i<N;i++){t=a[i];low=1;high=i-1;while(low<=high)mid=(low+high)/2;if(a[mid]>t)high=mid-1;else low=mid+1;}for(j=i-1;j>=low;j--)a[j+1]=a[j];a[low]=t;}}//插入排序void Sort_charu (int a[],int p){int i,j,temp;for(i=1;i<N;i++){temp=a[i];//设置监视哨for(j=i;j>0&&a[j-1]>temp;j--)//寻找位置插入a[j]=a[j-1];//交换a[j]=temp;}}//选择排序void sort_xz(int a[],int p){int i,j,k;for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)//寻找最小的记录序号if(a[j]<a[k])k=j;//记录if(k!=i){int temp;temp=a[k];a[k]=a[i];a[i]=temp;}//交换}}void sort_mp(int a[],int p){for (i=0;i<N-1;i++){for (j=N-1;j>i;j--)if (a[j]<a[j-1]){temp=a[j];a[j]=a[j-1];a[j-1]=temp;}}}void creatheap(int a[],int i,int n) //创建堆{int j;int t;t=a[i];//堆顶元素暂存j=2*(i+1)-1;while(j<=n)//堆顶元素下筛{if((j<n)&&(a[j]<a[j+1]))//确定下筛位置j++;if(t<a[j]){a[i]=a[j];i=j;j=2*(i+1)-1;}//a[j]往堆顶方向移elsej=n+1;}a[i]=t;}//不移动,返回堆顶void sort_d(int a[],int n,int p) //堆排序{int i;int t;for(i=n/2-1;i>=0;i--)//在序列的中间位置找一个数做堆顶creatheap(a,i,n-1);for(i=n-1;i>=1;i--)//n-1次筛选{t=a[0];a[0]=a[i];a[i]=t;creatheap(a,0,i-1);}}//插入排序时间double TSort_charu(int a[],int p){int i;double time;int b[N];for(i=0;i<N;i++)b[i]=a[i];//函数值的调用Start=clock();Sort_charu(b,p); //执行算法Now=clock();time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差if(p!=6){change(b);getchar();}//如果用户输入选择不为计算时钟,则要选择换行输出printf("\n用直接插入排序法用的时间为%f秒;",time);FILE *fp;fp=fopen("F:直接插入排序.txt","w");//在f盘保存一个文本文件for(i=0;i<N;i++)fprintf(fp,"%d ",b[i]);fclose(fp);return(time);}//选择排序时间double Tsort_xz(int a[],int p){int i;double time;int b[N];for(i=0;i<N;i++)b[i]=a[i];Start=clock();sort_xz(b,p);//执行函数if(p!=6){change(b);getchar();}Now=clock();time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差printf("\n用直接选择排序法用的时间为%f秒;",time);FILE *fp;//文件指针fp=fopen("F:直接选择排序.txt","w"); //存档for(i=0;i<N;i++)fprintf(fp,"%d ",b[i]);//读写一个文档fclose(fp);return(time);//冒泡排序时间double Tsort_mp(int a[],int p){int i;double time;int b[N];for(i=0;i<N;i++)b[i]=a[i];Start=clock();sort_mp(b,p);Now=clock();time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差if(p!=6){change(b);getchar();}printf("\n用冒泡排序法用的时间为%f秒;",time);FILE *fp;fp=fopen("F:冒泡排序.txt","w");for(i=0;i<N;i++)fprintf(fp,"%d ",b[i]);fclose(fp);return(time);}//二分插入排序时间double TSort_efcr(int a[],int p){int i;double time;int b[N];for(i=0;i<N;i++)b[i]=a[i];//函数值的调用Start=clock();Sort_efcr(b,p); //执行算法Now=clock();time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差if(p!=6){change(b);getchar();}//如果用户输入选择不为计算时钟,则要选择换行输出printf("\n用二分插入排序法用的时间为%f秒;",time);FILE *fp;fp=fopen("F:二分插入排序.txt","w");//在f盘保存一个文本文件for(i=0;i<N;i++)fprintf(fp,"%d ",b[i]);fclose(fp);return(time);}double Tsort_d(int a[],int n,int p)//堆排序时间int i;double time;int b[N];for(i=0;i<N;i++)b[i]=a[i];Start=clock();sort_d(b,N,p);Now=clock();time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差if(p!=6){change(b);getchar();}printf("\n用堆排序法用的时间为%f秒;",time);FILE *fp;fp=fopen("F:堆排序.txt","w");for(i=0;i<N;i++)fprintf(fp,"%d ",b[i]);fclose(fp);return(time);}void BubleSort(double a[]) //时间数组的排序(冒泡){int i,j;double temp;for(i=1;i<6;i++){for(j=4;j>=i;j--)if(a[j+1]<a[j]){temp=a[j+1];a[j+1]=a[j];a[j]=temp;}}}void menu(){printf("\n");printf(" ***************************尊敬的用户您好*************************** \n");printf("\n");printf(" ****欢迎使用由XXXXXXXXXXXXX 编辑的综合排序系统!**** \n");printf("printf("\n");printf(" 现在请您做出以下选择\n");printf("\n");printf("\n");printf(" ********************************************************************* \n");printf("\n");printf(" ************** 1:直接插入排序***********\n");printf(" ************** 2:直接选择排序***********\n");printf(" ************** 3:冒泡排序***********\n");printf(" ************** 4:二分插入排序***********\n");printf(" ************** 5:堆排序***********\n");printf(" ************** 6:时间效率比较***********\n");printf(" ************** 7:显示随机数***********\n");printf(" ************** 0:退出***********\n"); printf("\n");printf(" ******************************************************************** \n");}void main(){int i,p,a[N];double TIMES[5],TIMES1[5];//时间数组srand((int)time(NULL));for(i=0;i<N;i++)a[i]=rand() 000+1; //随机为数组赋值//循环执行,直到按0退出while(1){system("cls");menu(); //显示选择界面scanf("%d",&p); //等待输入//输入0退出if(p==0){printf(" ************************谢谢!欢迎下次使用*************************!\n");getchar();break;}//判断输入值,选择相应的操作switch(p){case 1:TSort_charu(a,p);printf("\n请按任意键继续...");getchar();break;case 2:Tsort_xz(a,p);printf("\n请按任意键继续...");getchar();break;case 3:Tsort_mp(a,p);printf("\n请按任意键继续...");getchar();break;case 4:TSort_efcr(a,p);printf("\n请按任意键继续...");getchar();break;case 5:Tsort_d(a,N,p);printf("\n请按任意键继续...");getchar();break;case 6:system("cls");TIMES1[1]=TIMES[1]=TSort_charu(a,p);TIMES1[2]=TIMES[2]=Tsort_xz(a,p);TIMES1[3]=TIMES[3]=Tsort_mp(a,p);TIMES1[4]=TIMES[4]=TSort_efcr(a,p);TIMES1[5]=TIMES[5]=Tsort_d(a,N,p);getchar();BubleSort(TIMES);printf("\n\n");{printf("排序这组数据两种较快的排序法分别是:\n");if(TIMES[1]==TIMES1[1]) printf("直接插入排序:%f秒!\n",TIMES[1]);if(TIMES[1]==TIMES1[2]) printf("直接选择排序:%f秒!\n",TIMES[1]); if(TIMES[1]==TIMES1[3]) printf("冒泡排序:%f秒!\n",TIMES[1]);if(TIMES[1]==TIMES1[4]) printf("二分插入排序:%f秒!\n",TIMES[1]);if(TIMES[1]==TIMES1[5]) printf("堆排序:%f秒!\n",TIMES[1]);if(TIMES[1]!=TIMES[2]){if(TIMES[2]==TIMES1[1]) printf("直接插入排序:%f秒!\n",TIMES[2]);if(TIMES[2]==TIMES1[2]) printf("直接选择排序%f秒!\n",TIMES[2]); if(TIMES[2]==TIMES1[3]) printf("冒泡排序%f秒!\n",TIMES[2]);if(TIMES[2]==TIMES1[4]) printf("二分插入排序:%f秒!\n",TIMES[1]); if(TIMES[2]==TIMES1[5]) printf("堆排序%f秒!\n",TIMES[2]);}}printf("\n请按任意键继续...");srand((int)time(NULL));for(i=0;i<N;i++) {a[i]=rand() 000+1;} getchar();break;case 7:change(a);FILE *fp;fp=fopen("F:随机数.txt","w");for(i=0;i<N;i++) fprintf(fp,"%d ",a[i]);fclose(fp);getchar();printf("\n请按任意键继续...");getchar();break;default:Wrong();getchar();break;}}}可能出现的错误及处理办法:LINK : error LNK2001 无法解析的外部符号_mainCRTStartup 刚安装Microsoft visual C++ 2010 学习版,运行一段代码,出现了如下图错误:在网上找了半天类似的错误,有说建项目属性=》链接器=》系统,应该设置为windows,我设置了也不好使。