当前位置:文档之家› C语言综合实现所有排序方法及效率比较

C语言综合实现所有排序方法及效率比较

#include<iostream.h>#include<stdio.h>#include<stdlib.h>#include<time.h>#define N 50000typedef char elemtype; typedef struct{int key;elemtype otheritem;}recdtype,*Recdtype;recdtype R[N];//直接插入排序void InsertSort(Recdtype R,int n) {int i,j;for(i=2;i<=n;i++){R[0]=R[i];j=i-1;while(R[0].key<R[j].key){R[j+1]=R[i];j--;}R[j+1]=R[0];}}/*InsertSort*///折半查找void BinSort(recdtype R[],int n) {int i,j,low,high,m;for(i=2;i<=n;i++){R[0]=R[i];low=1;high=i-1;while(low<=high){m=(low+high)/2;if(R[0].key<R[m].key)high=m-1;elselow=m+1;}for(j=i-1;j>=high+1;j--)R[j+1]=R[j];R[high+1]=R[0];}}/*BinSort*///希尔排序void ShellSort(recdtype R[],int n){int i,j;for(int d=N/2;d>=1;d=d/2){for(i=1+d;i<=n;i++){R[0]=R[i];j=i-d;while(j>0&&R[0].key<R[j].key){R[j+d]=R[j];j=j-d;}R[j+d]=R[0];}}}/*ShellSort*///冒泡排序void BubbleSort(recdtype R[],int n){int lastExchange;recdtype temp;for(int i=0;i<n-2;i++){lastExchange=1;for(int j=n-1;j>=i;j--){if(R[j+1].key<R[i].key){temp=R[i+1];R[i+1]=R[i];R[i]=temp;lastExchange=0;}if(lastExchange)break;}}}/*BubbleSort*///快速排序int Partition(recdtype R[],int l,int h)//一次划分算法{int i=l;int j=h;R[0]=R[i];int x=R[i].key ;while(i<j){while(i<j&&R[j].key >=x)j--;R[i]=R[j];while(i<j&&R[i].key <=x)i++;R[j]=R[i];}R[i]=R[0];return i;}void QuickSort(recdtype R[],int s,int t)//快速排序{int k;if(s<t){k=Partition(R,s,t);QuickSort(R,s,k-1);QuickSort(R,k+1,t);}}//直接选择排序void SelectSort(recdtype R[],int n){int i,j,k;for(i=1;i<n;i++){k=i;for(j=i+1;j<=n;j++)if(R[j].key<R[k].key)k=j;if(i!=k){R[0]=R[i];R[i]=R[k];R[k]=R[0];}}}/*SlectSort*///堆排序void Shift(recdtype R[],int i,int m){int j;R[0]=R[i];for(j=2*i;j<=m;j*=2){if(j<m&&R[j].key<R[j+1].key)j++;if(R[0].key<R[j].key){R[i]=R[j];i=j;}elsebreak;}R[i]=R[0];}/*Shift*/void HeapSort(recdtype R[],int n){recdtype temp;int i;for(i=n/2;i>0;i--)Shift(R,i,n);for(i=n;i>1;i--){temp=R[1];R[1]=R[i];R[i]=temp;Shift(R,1,i-1);}}/*HeapSort*///二路归并算法void Merge(recdtype R[],int low,int middle,int high) {int h,i,j,k;recdtype R1[N+1];h=low;i=low;j=middle+1;while(h<=middle&&j<=high){if(R[h].key <=R[j].key ){R1[i]=R[h];h++;}else{R1[i]=R[j];j++;}i++;}if(h>middle)for(k=j;k<=high;k++){R1[i]=R[k];i++;}else{for(k=h;k<=middle;k++){R1[i]=R[k];i++;}}for(k=low;k<=high;k++){R[k]=R1[k];}}void MergeSort(recdtype R[],int low,int high)//归并排序{int middle;if(low<high){middle=(low+high)/2;MergeSort(R,low,middle);MergeSort(R,middle+1,high);Merge(R,low,middle,high);}}//计算时间差void DifferTime(double finish,double start){double difftime=(finish-start)/CLOCKS_PER_SEC;cout<<"the cost of times:"<<difftime<<endl; }/*Differ*/void main(){int i,kind;char flag='y';time_t start,finish;start=time(NULL);finish=time(NULL);recdtype R[N];srand((unsigned)time(NULL));cout<<"测试数组元素的个数为:"<<N<<endl;while(flag=='y'){cout<<"请输入排序种类(1~8):"<<endl;cin>>kind;switch(kind){case 1:cout<<"冒泡排序:"<<endl;for( i=1;i<=N;i++)R[i].key=rand();start= clock();BubbleSort(R,N);finish= clock();DifferTime(finish,start);break;case 2:cout<<"希尔排序:"<<endl;for( i=1;i<=N;i++)R[i].key=rand();start= clock();ShellSort(R,N);finish= clock();DifferTime(finish,start);break;case 3:cout<<"折半插入排序:"<<endl;for( i=1;i<=N;i++)R[i].key=rand();start= clock();BinSort(R,N);finish= clock();DifferTime(finish,start);break;case 4:cout<<"直接插入排序:"<<endl;for( i=1;i<=N;i++)R[i].key=rand();start= clock();InsertSort(R,N);finish= clock();DifferTime(finish,start);break;case 5:cout<<"快速排序:"<<endl;for( i=1;i<=N;i++)R[i].key=rand();start= clock();QuickSort(R,1,N);finish= clock();DifferTime(finish,start);break;case 6:cout<<"直接选择排序:"<<endl;for( i=1;i<=N;i++)R[i].key=rand();start= clock();SelectSort(R,N);finish= clock();DifferTime(finish,start);break;case 7:cout<<"堆排序:"<<endl;for( i=1;i<=N;i++)R[i].key=rand();start= clock();HeapSort(R,N);finish= clock();DifferTime(finish,start);break;case 8:cout<<"二路归并排序:"<<endl;for( i=1;i<=N;i++)R[i].key=rand();start= clock();MergeSort(R,1,N);finish= clock();DifferTime(finish,start);break;default:cout<<"输入错误,程序结束!"<<endl;return;}cout<<"是否继续?(输入n结束,输入y有效!)"<<endl;cin>>flag;}cout<<"测试结束,再见!"<<endl; }。

相关主题