文档视界 最新最全的文档下载
当前位置:文档视界 › 数据结构课程设计之综合排序

数据结构课程设计之综合排序


#include //标准输入输出头文件
#include //定义杂项函数及内存分配函数
#include //字符串处理
#include //定义关于时间的函数
#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{
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{
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{
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{
k=i;
for(j=i+1;jif(a[j]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{
for (j=N-1;j>i;j--)
if (a[j]{
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((jj++;
if(t{
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;ib[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

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;ib[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;ifprintf(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;ib[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;ifprintf(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;ib[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;ifprintf(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;ib[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;ifprintf(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]{
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
void menu()
{
printf(" \n");
printf(" ***************************尊敬的用户您好*************************** \n");
printf(" \n");
printf(" ****欢迎使用由计算机1004班 吴丽娜 3100301401 编辑的综合排序系统!**** \n");
printf(" \n");
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;ia[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;icase 7:change(a);FILE *fp;
fp=fopen("F:随机数.txt","w");
for(i=0;ifclose(fp);getchar();
printf("\n请按任意键继续...");
getchar();break;
default:Wrong();
getchar();break;
}
}
}

相关文档