各种排序算法的比较

这是我很久以前的一个课程设计作业,放这里以后可以参考。

在vc下可以运行,但在dev-c++下有点小问题,算了,我不改了,反正以后也只看那些算法而不需要做这种无聊的课程设计了的。

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
#define  N  10000  //产生的数的个数
static __int64 compare_num;  //数据比较次数(不包括比较下标) ,有些排序算法需要不断的调用其他函数,所以要用静态量
static __int64  transmit_num;  //数据传递次数 ,这里一次交换等于3次赋值传递,这里主要是因为有些排序算法是通过插入数据来进行排序的
//直接选择排序
void Select_Sort(int R[],int n){
 compare_num=0;
 transmit_num=0;
 char flag='0';
 cout<<"是否输出所有的数字(1/0):"<<endl;
 cin>>flag;
 while(flag>'1'||flag<'0'){
  cout<<"输入有误,请重新输入:"<<endl;
  cin>>flag;
 }
 int i;
 if(flag=='1'){
 cout<<"排序前:"<<endl;
 for( i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
 int k;
 clock_t begin,end;
 begin=clock();  //排序前的时间点
 for(i=1;i<n;i++){  //做n-1 趟选取
  k=i;
  for(int j=i+1;j<=n;j++){     //在i 开始的n-i+1个记录中选取关键码最小的记录
      compare_num++;
   if(R[j]<R[k] )
    k=j;
   if(k!=i){
    R[0]=R[k];
    R[k]=R[i];
    R[i]=R[0];
    transmit_num+=3;
   }
  }
 }
 end=clock();   //排序后的时间点
 if(flag=='1'){
 cout<<"直接选择排序后:"<<endl;
 for(i=1;i<=n;i++)
  cout<<R[i]<<',';
  cout<<endl;
 }
  double time; 
  time=(double)(end-begin)/CLOCKS_PER_SEC;   //排序所用的时间,下同
        printf("排序过程所用时间为: %.6lf s\n",time);  
  printf("排序过程比较次数为: %I64d\n",compare_num);
  printf("排序过程传递次数为: %I64d\n",transmit_num);
}
  
 
//冒泡排序

void Bubble_Sort(int R[],int n ){ 
 compare_num=0;
 transmit_num=0;
 char flag='0';
 cout<<"是否输出所有的数字(1/0):"<<endl;
 cin>>flag;
 while(flag>'1'||flag<'0'){
  cout<<"输入有误,请重新输入:"<<endl;
  cin>>flag;
 }
 int i;
 if(flag=='1'){
 cout<<"排序前:"<<endl;
 for( i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
 clock_t  begin,end;
 begin=clock();
    for(i=1;i<n;i++){  //执行n-1趟
  int swap=0; 
  for(int j=1;j<=n-i;j++){
    compare_num++;
    if(R[j] > R[j+1] ){
     R[0]=R[j];
     R[j]=R[j+1];
     R[j+1]=R[0];
     transmit_num+=3;
     swap=1;
    }
  }
   if(swap==0) // 没有发生一次交换,说明序列有序,则跳出循环,排序结束
     break;
  }
 end=clock();
 if(flag=='1'){
 cout<<"冒泡排序后:"<<endl;
  for(i=1;i<=n;i++)
   cout<<R[i]<<',';
  cout<<endl;
 }
   double time;
  time=(double)(end-begin)/CLOCKS_PER_SEC;
        printf("排序过程所用时间为: %.6lf s\n",time); 
  printf("排序过程比较次数为: %I64d\n",compare_num);
  printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//直接插入排序
void D_InsertSort(int R[],int n){
 compare_num=0;
 transmit_num=0;
 char flag='0';
 cout<<"是否输出所有的数字(1/0):"<<endl;
 cin>>flag;
 while(flag>'1'||flag<'0'){
  cout<<"输入有误,请重新输入:"<<endl;
  cin>>flag;
 }
 int i;
 if(flag=='1'){
 cout<<"排序前:"<<endl;
 for(i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
 clock_t begin,end;
 begin=clock();
 for(i=2;i<=n;i++){
  compare_num++;
  if(R[i]<R[i-1]){  //小于时,需将R[i]插入到有序表适当位置
   R[0]=R[i]; 
   transmit_num++;
   for(int j=i-1;R[j]>R[0];j--){
    R[j+1]=R[j];   // 记录后移
    compare_num++;
    transmit_num++;
   }
   R[j+1]=R[0];   //插入到正确位置
   transmit_num++;
  }
 }
 end=clock();
 if(flag=='1'){
 cout<<"直接插入排序后:"<<endl;
 for(i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
  double time;
  time=(double)(end-begin)/CLOCKS_PER_SEC;
        printf("排序过程所用时间为: %.6lf s\n",time); 
  printf("排序过程比较次数为: %I64d\n",compare_num);
  printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//希尔排序
void ShellInsert(int R[],int n,int dk){
 int i;
 for(i=dk+1;i<=n;i++){
  compare_num++;
  if(R[i]<R[i-dk]){   //小于时,需R[i]将插入有序表
   R[0]=R[i];   //存储待插入的记录
   transmit_num++;
   for(int j=i-dk;j>0&&R[j]>R[0];j=j-dk){
    R[j+dk]=R[j];  //记录后移
    transmit_num++;
    compare_num++;
   }
   R[j+dk]=R[0];  //插入到正确位置
   transmit_num++;
  }
 }
}
void ShellSort(int R[],int n){
 compare_num=0; 
    transmit_num=0;
 int t[10]={21,19,17,13,11,7,5,3,2,1};  //步长因子中除1外没有公因子,且最后一个步长因子必须为1
 char flag='0';
 cout<<"是否输出所有的数字(1/0):"<<endl;
 cin>>flag;
 while(flag>'1'||flag<'0'){
  cout<<"输入有误,请重新输入:"<<endl;
  cin>>flag;
 }
 int i;
 if(flag=='1'){
 cout<<"排序前:"<<endl;
 for( i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
 clock_t begin,end;
 begin=clock();
 for(i=0;i<10;i++)
  ShellInsert(R,n,t[i]);  //调用每个步长因子
 end=clock();
 if(flag=='1'){
 cout<<"希尔排序后:"<<endl;
 for(i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
  double time;
  time=(double)(end-begin)/CLOCKS_PER_SEC;
        printf("排序过程所用时间为: %.6lf s\n",time); 
  printf("排序过程比较次数为: %I64d\n",compare_num);
  printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//快速排序
int Partition(int R[],int i,int j){ //已R[i]为支点进行划分,算法返回支点记录最终的位置
    R[0]=R[i];  //缓存支点记录
 while(i<j){          //从表的两端交替地向中间扫描
  while(i<j&&R[j]>=R[0])  {
   j--;
   compare_num++;
  }
  if(i<j){   //将比支点记录小的交换到前面
   R[i]=R[j];
   i++;
   transmit_num++;
  }
  while(i<j&&R[i]<R[0]){
   i++;
   compare_num++;
  }
  if(i<j){  //将比支点记录大的交换到后面
   R[j]=R[i];
   j--;
   transmit_num++;
  }
 }
 R[i]=R[0];
 transmit_num++;
 return i;
}
void Quick_Sort(int R[],int s,int t){
 int i;
 if(s<t){
  i=Partition(R,s,t); //将表一分为二
  Quick_Sort(R,s,i-1);  //对支点前端子表递归排序
  Quick_Sort(R,i+1,t);  //对支点后端子表递归排序
 }
}
void Quick(int R[],int n){
 compare_num=0; 
    transmit_num=0;
 char flag='0';
 cout<<"是否输出所有的数字(1/0):"<<endl;
 cin>>flag;
 while(flag>'1'||flag<'0'){
  cout<<"输入有误,请重新输入:"<<endl;
  cin>>flag;
 }
 int i;
 if(flag=='1'){
 cout<<"排序前:"<<endl;
 for(i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
 clock_t begin,end;
 begin=clock();
 Quick_Sort(R,1,n);
 end=clock();
 if(flag=='1'){
     cout<<"快速排序后:"<<endl;
 for(i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
  double time;
  time=(double)(end-begin)/CLOCKS_PER_SEC;
        printf("排序过程所用时间为: %.6lf s\n",time); 
  printf("排序过程比较次数为: %I64d\n",compare_num);
  printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//堆排序
void HeapAjust(int R[],int s,int t){
 int j;
 R[0]=R[s];
 for(j=2*s;j<=t;j=2*j){  //沿关键码较大的孩子结点向下筛选
  if(j<t && R[j]<R[j+1]){
   compare_num++;
   j++;               //j指向R[i]的关键码较大的孩子
  }
  if(R[0]>R[j]){  //不用调到叶子就到位了
   compare_num++;
   break;
  }
  R[s]=R[j];
  transmit_num++;
  s=j;  //准备向下调整
 }
 R[s]=R[0];  //插入
}
void HeapSort(int R[],int n){
 compare_num=0; 
    transmit_num=0;
 char flag='0';
 cout<<"是否输出所有的数字(1/0):"<<endl;
 cin>>flag;
 while(flag>'1'||flag<'0'){
  cout<<"输入有误,请重新输入:"<<endl;
  cin>>flag;
 }
 int i;
 if(flag=='1'){
 cout<<"排序前:"<<endl;
 for( i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
 clock_t begin,end;
 begin=clock();
 for(i=n/2;i>0;i--)
  HeapAjust(R,i,n); //将R[1]……R[n]建成堆
 for(i=n;i>1;i--){
  R[0]=R[1];  //堆顶R[1]与堆底R[i]交换
  R[1]=R[i];
  R[i]=R[0];
  transmit_num+=3;
  HeapAjust(R,1,i-1);  //将R[1]……R[i-1]重新调整为堆
 }
 end=clock();
 if(flag=='1'){
  cout<<"堆排序后:"<<endl;
 for(i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
  double time;
  time=(double)(end-begin)/CLOCKS_PER_SEC;
        printf("排序过程所用时间为: %.6lf s\n",time); 
  printf("排序过程比较次数为: %I64d\n",compare_num);
  printf("排序过程传递次数为: %I64d\n",transmit_num);
}
//归并排序
void Merge(int R[],int s,int m,int t){  //把两个有序子表归并
 int i,j;
 i=s;
 j=m+1;
 int p=0;
 int R1[N];
 while(i<=m&&j<=t){
  compare_num++;
  if(R[i]<R[j]){ 
   R1[p]=R[i];
   p++;
   i++; 
   transmit_num++;
  }
  else{
   R1[p]=R[j];
   p++;
   j++;
   transmit_num++;
  }
 }
  while(i<=m){
   R1[p]=R[i];
   p++;
   i++;
   transmit_num++;
  }
  while(j<=t){
   R1[p]=R[j];
   p++;
   j++;
   transmit_num++;
  }
 
  for(p=0,i=s;i<=t;i++,p++){
   R[i]=R1[p];
   transmit_num++;
  }
}
void Msort(int R[],int s,int t){
 int m;
 if(s<t){
  m=(s+t)/2;
  Msort(R,s,m); //递归地将R[s]~R[m]归并为有序的R1[s]~R1[m]
  Msort(R,m+1,t);  //递归地将R[m+1]~R[t]归并为有序的R1[m+1]~R1[t]
  Merge(R,s,m,t);  //将R1[s]~R1[m]和R1[m+1]~R1[t]归并到R[s]~R[t]
 }
}
void MergeSort(int R[],int n){
 compare_num=0; 
    transmit_num=0;
 char flag='0';
 cout<<"是否输出所有的数字(1/0):"<<endl;
 cin>>flag;
 while(flag>'1'||flag<'0'){
  cout<<"输入有误,请重新输入:"<<endl;
  cin>>flag;
 }
 int i;
 cout<<"排序前:"<<endl;
    if(flag=='1'){
 for(i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
 clock_t begin,end;
 begin=clock();
 Msort(R,1,n);
 end=clock();
 if(flag=='1'){
  cout<<"归并排序后:"<<endl;
 for(i=1;i<=n;i++)
  cout<<R[i]<<',';
 cout<<endl;
 }
  double time;
  time=(double)(end-begin)/CLOCKS_PER_SEC;
        printf("排序过程所用时间为: %.6lf s\n",time); 
  printf("排序过程比较次数为: %I64d\n",compare_num);
  printf("排序过程传递次数为: %I64d\n",transmit_num);

}

 int  main(){
  while(1){
    int R[N+1],i;
 cout<<"1   在完全随机的情况下对关键码进行排序"<<endl;
 cout<<"2   在完全正序的情况下对关键码进行排序"<<endl;
 cout<<"3   在完全逆序的情况下对关键码进行排序"<<endl;
 cout<<"0   退出"<<endl;
 cout<<"请选择:"<<endl;
 char p;
 cin>>p;
 while(p-48<0||p-48>3){
  cout<<"输入有误,请重新输入:"<<endl;
  cin>>p;
 }
 if(p-48==0)
  break;
 if(p-48==1){
     srand((unsigned)time(NULL));
 for(i=1;i<=N;i++)
  R[i]=rand()%10000+1;
 }
 else if(p-48==2){
  for(i=1;i<=N;i++)
   R[i]=i;
 }
 else
  for(i=N;i>=1;i--)
   R[N-i+1]=i;

 char k;
 cout<<endl;
 cout<<"1   直接插入排序"<<endl;
 cout<<"2   希尔排序"<<endl;
 cout<<"3   冒泡排序"<<endl;
 cout<<"4   快速排序"<<endl;
 cout<<"5   直接选择排序"<<endl;
 cout<<"6   堆排序"<<endl;
 cout<<"7   归并排序"<<endl;
 cout<<"0   退出程序"<<endl;
 cout<<"请选择排序方法:"<<endl;
 cin>>k;
 while(k-48<0||k-48>7){
  cout<<"输入有误,请重新输入:"<<endl;
  cin>>k;
 }
 switch(k-48){
 case 0:cout<<"谢谢使用!"<<endl;exit(0);
 case 1:D_InsertSort(R,N);break;
 case 2:ShellSort(R,N);break;
 case 3:Bubble_Sort(R,N);break;
 case 4:Quick(R,N);break;
 case 5:Select_Sort(R,N);break;
 case 6:HeapSort(R,N);break;
 case 7:MergeSort(R,N);break;
 }
 system("pause");system("cls");
 }
 return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值