C语言改错
发表在C语言图书答疑 2015-04-07
是否精华
版块置顶:
运行出现错误不知怎么改。。

#include <stdio.h>//标准输入输出头文件
#include <stdlib.h>//定义杂项函数及内存分配函数
#include <string.h>    //字符串处理
#include <time.h>//定义关于时间的函数
#define N 20000

clock_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)
{

int i,j,temp;

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]往堆顶方向移
  else
   j=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("E:直接插入排序.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("E:冒泡排序.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("E:二分插入排序.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("E:堆排序.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("                                                                         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("nn");
 {
  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("E:随机数.txt","w");
 for(i=0;i<N;i++) fprintf(fp,"%d ",a[i]);
 fclose(fp);getchar();
 printf("n请按任意键继续...");
 getchar();break;
 default:Wrong();

 getchar();break;
   }
}
}
分享到:
精彩评论 1
爱学习
学分:0 LV1
TA的每日心情
开心
2020-03-23 20:54:03
2015-04-08
沙发
请问这是哪本书上的哪个例子.
首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照