安徽科技学院 信网学院网络文化节 陈世宇

#include
#include<windows.h>
#include<stdio.h>
#include
#include<time.h>
#include<stdlib.h>
#include<bits/stdc++.h>
using namespace std;
struct sort1//定义结构体
{
char name[30];
double time;
};
void menu1()//菜单1
{
cout<<" 选择你要实现的功能";
cout<<’\n’;
cout<<“"<<endl;
cout<<""<<"[1]对一串数字进行排序 “<<”"<<endl;
cout<<""<<"[2]计算排序N个数用的时间"<<""<<endl;
cout<<"
”<<endl;
}
void menu()//菜单2
{
cout<<“你想要实现排序的算法”<<endl;
cout<<“"<<endl;
cout<<""<<"[01]冒泡排序"<<""<<endl;
cout<<""<<"[02]选择排序"<<""<<endl;
cout<<""<<"[03]插入排序"<<""<<endl;
cout<<""<<"[04]希尔排序"<<""<<endl;
cout<<"
”<<endl;
}
void transfer_data1(vector &v)//将类vector传递test文件
{
FILE *fp;int i;
if((fp=fopen(“c:/users/86158/desktop/data.txt”,“a+”))==NULL)
{
fp=fopen(“c:/users/86158/desktop/data.txt”,“w+”);
exit(0);
}
fprintf(fp,“排序前的数字:”);
for(i=0;i<10;i++)
fprintf(fp,"%d “,v[i]);
fprintf(fp,”\n");
fclose(fp);
}
void transfer_data2(vector &v)//同上函数 这个是排序后
{
FILE *fp;int i;
if((fp=fopen(“c:/users/86158/desktop/data.txt”,“a+”))==NULL)//这里“c:/users/86158/desktop/”是路径 根据具体情况改写
{
fp=fopen(“c:/users/86158/desktop/data.txt”,“w+”);
exit(0);
}
fprintf(fp,“排序后的数字:”);
for(i=0;i<10;i++)
fprintf(fp,"%d “,v[i]);
fprintf(fp,”\n");

fclose(fp);

}
void cout1(vector &v)//输出函数 将vector从0到结束输出
{
int i;
cout<<“排序后的数字:”;
cout<<’\n’;
for(i=0;i<v.size();i++)cout<<v[i]<<’ ‘;
cout<<"\n";
}
void cin1(vector &v)//输入函数 一直输入数字直到按下enter输入结束
{ int temp;char c;
cout<<“请输入你想要排序的所有数字:”<<endl;
while(cin>>temp)
{
v.push_back(temp);
c=cin.get();
if (c==’\n’)break;
}
}
void initialize_array(int *a,int n)//赋值函数 给数组随机赋值从0到n
{
srand(time(NULL));
int i;
for(i=0;i<n;++i)
a[i]=rand()%100;
}
void strswap(char *s1,char *s2)//交换两个字符串中的内容
{
char t;
if(strlen(s1)<strlen(s2))
while(*s2!=’\0’)
{
t=*s1;
*s1=*s2;
*s2=t;
s1++;s2++;
}
else
while(*s1!=’\0’)
{
t=*s1;
*s1=*s2;
*s2=t;
s1++;s2++;
}
}
void bubble_sort(int *a,int m)
{
int i=0,j=0,t=0;
for(i=0;i<m-1;i++)
for(j=0;j<m-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
void swap(int a,int c,int b)//交换a[c]和a[b]
{
int t;
t=a[c];
a[c]=a[b];
a[b]=t;
}
void heapadjust(int a,int s,int m)//将数组从s到m变为大顶堆
{
int temp,j;
temp=a[s];
for(j=2
s;j<m;j
=2)
{
if(j<m&&a[j]<a[j+1])
j++;
if(a[j]<=temp)break;
a[s]=a[j];
s=j;
}
a[s]=temp;
}
void heap_sort(int *a,int length)//数组实现的堆排序
{
int i,t;
for(i=length/2;i>0;i–)
heapadjust(a,i,length);

for(i=length;i>1;i--)
{
    swap(a,1,i);
    heapadjust(a,1,i-1);
}

}
void quick_sort(int *a,int left,int right)//数组实现的快速排序
{
if(right<left)return;
int i=left,j=right,z,temp=a[left];
while(i<j)
{
while(a[j]>=temp&&i<j)
j–;
while(a[i]<=temp&&i<j)
i++;
if(i<j)
{
z=a[i];
a[i]=a[j];
a[j]=z;
}
}
a[left]=a[i];
a[i]=temp;
quick_sort(a,left,i-1);
quick_sort(a,i+1,right);
return;
}

void bubble_sort(vector &v)//vector实现的冒泡排序
{
int i=0,j=0,m=v.size(),t=0;
for(i=0;i<m-1;i++)
for(j=0;j<m-i-1;j++)
{
if(v[j]>v[j+1])
{
t=v[j];
v[j]=v[j+1];
v[j+1]=t;
}
}
}

void selection_sort(vector &v)//vector实现的选择排序
{
int length=v.size(),min1,i,j,t;
for(i=0;i<length;i++)
{
min1=i;
for(j=i+1;j<length;j++)
if(v[j]<v[min1])min1=j;
if(min1!=i)
{
t=v[i];
v[i]=v[min1];
v[min1]=t;
}
}

}
void insertion_sort(vector &v)//vector实现的插入排序
{
int length=v.size(),i,j;
for(i=1;i<length;i++)
{
if(v[i]<v[i-1])
{
v[0]=v[i];
for(j=i-1;v[j]>v[0];j–)
{
v[j+1]=v[j];
}
v[j+1]=v[0];
}
}

}
void shell_sort(vector &v)//vector实现的希尔排序
{
int increment,i,j;
int length=v.size();
do
{
increment=increment/3+1;
for(i=increment+1;i<length;i++)
{
if(v[i]<v[i-increment])
{
v[0]=v[i];
for(j=i-increment;j>0&&v[j]>v[0];j-=increment)
v[j+increment]=v[j];
v[j+increment]=v[0];
}
}
}
while(increment>1);

}

int main()
{
int flag;
menu1();
cin>>flag;
sort1 s[3]=
{
{“bubble_sort”},
{“heap_sort”},
{“quick_sort”},
};//定义结构体数组
if(flag==1)
{
system(“cls”);
vectorv;int i;
while(1)
{
menu();
int a;
cin>>a;
switch(a)
{
case 0:return 0;
case 1:system(“cls”);v.clear();cin1(v);transfer_data1(v);bubble_sort(v);cout1(v);transfer_data2(v);break;
case 2:system(“cls”);v.clear();cin1(v);transfer_data1(v);selection_sort(v);cout1(v);transfer_data2(v);break;
case 3:system(“cls”);v.clear();cin1(v);transfer_data1(v);insertion_sort(v);cout1(v);transfer_data2(v);break;
case 4:system(“cls”);v.clear();cin1(v);transfer_data1(v);shell_sort(v);cout1(v);transfer_data2(v);break;
}
}
}
else
{
system(“cls”);
while(1)
{

 long N;cout<<"你先要排序数组的长度(不得小于10000,排序时间小于一毫秒无法计算):";cin>>N;
 int a[N];double start,finish;

 initialize_array(a,N);
 start=clock();
 bubble_sort(a,N);
 finish=clock();
 s[0].time=(finish-start)/1000;

 initialize_array(a,N);
 start=clock();
 heap_sort(a,N);
 finish=clock();
 s[1].time=(finish-start)/1000;

 initialize_array(a,N);
 start=clock();
 quick_sort(a,0,N);
 finish=clock();
 s[2].time=(finish-start)/1000;

 //将结构体数组按照“时间”成员 从用时短到用时长进行排序
 for(int i=0;i<2;i++)
	for(int j=0;j<2;j++)
	{
		if(s[j].time>=s[j+1].time)
		{
			double temp;
			temp=s[j].time;
			s[j].time=s[j+1].time;
			s[j+1].time=temp;
			strswap(s[j].name,s[j+1].name);
		}
	}
cout<<endl;
for(int i=0;i<3;i++)
cout<<s[i].name<<"所用时间:"<<s[i].time<<"seconds."<<endl;//输出排序后的算法名称及其所用时间
}

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值