c语言的多种排序的比较
charu_paixu(MAX); //插入排序
zheban_charu_paixu(MAX); //折半插入排序
xuanze_paixu(MAX); //选择排序
maopao_paixu(MAX); //冒泡排序
maopao_paixu_gailiang(MAX);//冒泡排序改良
kuaisu_paixu(MAX*10); //快速排序
fendui_paixu(MAX*10); //堆排序
guibin_paixu(MAX*10); //归并排序
快速排序速度远远快于其它排序,方法本身难度也并不是很大,极力推荐学习。
程序中MAX代表排序的数的个数,初始设为10000;
每种排序会循环进行十次取平均数,修改t值可改变循环次数;
取消各个排序函数中的注释部分即可打印排序结果,方便测试使用(同时最好把MAX值改为10等方便打印);
运行结果
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX 10000
int *Creat(int num)
{
int *a=new int[num];
for(int i=0;i<num;i++)
{
a[i]=rand()%100;
}
return a;
}
void swap(int *a,int i,int j)
{
int t;
t=a[i];
a[i]=a[j];
a[j]=t;
}
///////////////////////////////////////////////////////////////////////////////
void charu_paixu(int num)
{
int *a=new int[num];
int sum=0;
int starttime,endtime;
int temp;
for(int t=0;t<10;t++)
{
a=Creat(num);
starttime=clock();
for(int i=1;i<num;i++)
{
int j=i-1;
int temp=a[i];
while(j>=0&&temp<a[j])
{
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
endtime=clock();
// for(int i=0;i<num;i++)
// printf("%d ",a[i]);printf("\n");
sum=sum+(endtime-starttime);
}
printf("\n插入排序(%d)Running Time=%dms\n",num,sum/10);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void zheban_charu_paixu(int num)
{
int *a=new int[num];
int sum=0;
int starttime,endtime;
int temp;
for(int t=0;t<10;t++)
{
a=Creat(num);
starttime=clock();
for(int i=1;i<num;i++)
{
int m;
int temp=a[i];
int low=0;
int high=i-1;
while(low<=high)
{
m=(low+high)/2;
if(temp<a[m])high=m-1;
else low=m+1;
}
for(int j=i-1;j>high;j--)
a[j+1]=a[j];
a[high+1]=temp;
}
endtime=clock();
// for(int i=0;i<num;i++)
// printf("%d ",a[i]);printf("\n");
sum=sum+(endtime-starttime);
}
printf("\n折半插入排序(%d)Running Time=%dms\n",num,sum/10);
}
///////////////////////////////////////////////////////////////////////////////////////////
void xuanze_paixu(int num)
{
int *a=new int[num];
int sum=0;
int starttime,endtime;
int temp;
for(int t=0;t<10;t++)
{
a=Creat(num);
starttime=clock();
for(int i=0;i<num-1;i++)
{
int min=i;
for(int j=i+1;j<num;j++)
{
if(a[min]>a[j])
min=j;
}
swap(a,i,min);
}
endtime=clock();
// for(int i=0;i<num;i++)
// printf("%d ",a[i]);printf("\n");
sum=sum+(endtime-starttime);
}
printf("\n选择排序(%d)Running Time=%dms\n",num,sum/10);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void maopao_paixu(int num)
{
int *a=new int[num];
int sum=0;
int starttime,endtime;
int temp;
for(int t=0;t<10;t++)
{
a=Creat(num);
starttime=clock();
for(int i=0;i<num-1;i++)
{
for(int j=i+1;j<num;j++)
{
if(a[i]>a[j])swap(a,i,j);
}
}
endtime=clock();
// for(int i=0;i<num;i++)
// printf("%d ",a[i]);printf("\n");
sum=sum+(endtime-starttime);
}
printf("\n冒泡排序(%d)Running Time=%dms\n",num,sum/10);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void maopao_paixu_gailiang(int num)
{
int *a=new int[num];
int sum=0;
int starttime,endtime;
int temp;
for(int t=0;t<10;t++)
{
int lastchange;
int i=num-1;
a=Creat(num);
starttime=clock();
while(i>0)
{
lastchange=0;
for(int j=0;j<i;j++)
{
if(a[j]>a[j+1])
{
swap(a,j,j+1);
lastchange=j;
}
}
i=lastchange;
}
endtime=clock();
// for(int i=0;i<num;i++)
// printf("%d ",a[i]);printf("\n");
sum=sum+(endtime-starttime);
}
printf("\n冒泡排序改良(%d)Running Time=%dms\n",num,sum/10);
}
///////////////////////////////////////////////////////////////////////////////////////////
int fenkuai(int *a,int i,int j)
{
int start=i;
int end=j+1;
int flag=start;
int X=a[start];
while(1)
{
while(start<end&&a[++start]<X);
while(start<end&&a[--end]>X);
if(start>=end)break;
swap(a,start,end);
}
swap(a,flag,end-1);
return end;
}
void quick(int *a,int start,int end)
{
if(start<end)
{
int k=fenkuai(a,start,end);
quick(a,start,k-1);
quick(a,k,end);
}
}
void kuaisu_paixu(int num)
{
int *a=new int[num];
int sum=0;
int starttime,endtime;
int temp;
for(int t=0;t<10;t++)
{
a=Creat(num);
starttime=clock();
quick(a,0,num-1);
endtime=clock();
// for(int i=0;i<num;i++)
// printf("%d ",a[i]);printf("\n");
sum=sum+(endtime-starttime);
}
printf("\n(分块)快速排序(%d)Running Time=%dms\n",num,sum/10);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void HeapAdjust(int *a,int i,int num)
{
int child,temp;
for(;2*i+1<num;i=child)
{
child=2*i+1;
if(child<num-1&&a[child+1]>a[child])
++child;
if(a[i]<a[child])
{
temp=a[i];
a[i]=a[child];
a[child]=temp;
}
else break;
}
}
void HeapSort(int *a,int num)
{
for(int i=num/2-1;i>=0;--i)
HeapAdjust(a,i,num);
for(int i=num-1;i>0;--i)
{
int t;
t=a[i];
a[i]=a[0];
a[0]=t;
HeapAdjust(a,0,i);
}
}
void fendui_paixu(int num)
{
int *a=new int[num];
int sum=0;
int starttime,endtime;
int temp;
for(int t=0;t<10;t++)
{
a=Creat(num);
starttime=clock();
HeapSort(a,num);
endtime=clock();
// for(int i=0;i<num;i++)
// printf("%d ",a[i]);printf("\n");
sum=sum+(endtime-starttime);
}
printf("\n堆排序(%d)Running Time=%dms\n",num,sum/10);
}
////////////////////////////////////////////////////////////////////////////////////////////
void copy(int *a,int *p,int start,int n)
{
for(int i=0;i<n;i++)
p[i]=a[start+i];
}
void change(int *a,int *p1,int n1,int *p2,int n2)
{
int i,i1,i2;
i=i1=i2=0;
while(i1<n1&&i2<n2)
{
if(p1[i1]<p2[i2])a[i++]=p1[i1++];
else a[i++]=p2[i2++];
}
while(i1<n1)a[i++]=p1[i1++];
while(i2<n2)a[i++]=p2[i2++];
}
void guibin(int *a,int num)
{
int n1,n2;
if(num<=1)return;
n1=num/2;
n2=num-n1;
int *p1=new int[n1+1];
int *p2=new int[n2+1];
copy(a,p1,0,n1);
copy(a,p2,n1,n2);
guibin(p1,n1);
guibin(p2,n2);
change(a,p1,n1,p2,n2);
}
void guibin_paixu(int num)
{
int *a=new int[num];
int sum=0;
int starttime,endtime;
int temp;
for(int t=0;t<10;t++)
{
a=Creat(num);
starttime=clock();
guibin(a,num);
endtime=clock();
// for(int i=0;i<num;i++)
// printf("%d ",a[i]);printf("\n");
sum=sum+(endtime-starttime);
}
printf("\n归并排序(%d)Running Time=%dms\n",num,sum/10);
}
/////////////////////////////////////////////////////////////////////////////////
int main()
{
srand((unsigned)(time(NULL)));
charu_paixu(MAX); //插入排序
zheban_charu_paixu(MAX); //折半插入排序
xuanze_paixu(MAX); //选择排序
maopao_paixu(MAX); //冒泡排序
maopao_paixu_gailiang(MAX);//冒泡排序改良
kuaisu_paixu(MAX*10); //快速排序
fendui_paixu(MAX*10); //堆排序
guibin_paixu(MAX*10); //归并排序
}