c语言的多种排序的直观比较,插入排序,折半插入排序,选择排序,冒泡排序,冒泡排序改良,快速排序,堆排序,归并排序

本文对比了C语言中各种排序算法的效率,包括插入排序、折半插入排序、选择排序、冒泡排序、快速排序、堆排序和归并排序。通过实际编程测试,快速排序在大量数据处理上表现最优,推荐学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 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);      //归并排序 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙子树下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值