归并排序比快速排序慢吗?只是没有写对罢了

本文探讨了通常认为归并排序比快速排序慢的观点,并介绍了一种优化的归并排序算法,该算法在处理1W-1000W随机整数时,与普通快速排序的差距在5%以内,且在某些情况下比快速排序快10%。作者通过代码展示了优化思路,强调在特定情况下归并排序可以比快速排序快1000倍,但会额外占用O(n)空间。
摘要由CSDN通过智能技术生成

归并排序比快速排序慢吗?只是没有写对罢了

众所周知,归并 排序比快速排序慢,虽然它稳定,而且时间上也稳定,但是就是慢20%~100%,今天,我经过优化,使其达到了与快速排序相同的水平,对于1W-1000W的完全随机生成的小于1亿的int数据,其与普通快速排序的差距在5%以内,而且有时是它比普通快速排序快5%。对于经过随机数优化的快速排序,我的归并排序比其快10%左右,对于经典的归并排序,我的比它快20%左右。(1W以下时间几乎都是0没法比哈哈)
先上写法
对于一般的没有研究过的人来说,归并就是借用一个数组,来进行左右两半的排序,然后复制回去,但是我的算法不一样
先借用b数组对a数组进行排序,将对等的a,b里的b的所有数左右分别排序,然后合并到a上去

那么,b数组怎么排序呢?当然是借用a数组进行排序啦!
晕了吧?
其实很简单,我们通常的算法是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
这个是从
1 2 3 4 5 6 7 8 + 9 10 11 12 13 14 15 16中来的
而上面又是
1 2 3 4 + 5 6 7 8 + 9 10 11 12 + 13 14 15 16中来的
然后又要先排序
1 2 + 3 4 + 5 6 + 7 8 + 9 10 + 11 12 + 13 14 + 15 16
这样就完了。
但是我的算法是,把第1,3,5,7.。。步所用的数组合并
同理把2,4,6,8,10步的数组合并
好吧我讲晕了,直接上代码

void merge(int a[], int b[], int l, int r)
{
   
	int mid=(l+r)/2;
	if (l<mid)
		merge(b,a,l,mid);//注意这里,这就是我的算法的核心,下面的和别人都一样
	if(mid+1<r)
		merge(b,a,mid+1,r);//同理,核心
	int c=l,d=mid+1,e=l;
	while(c<=mid&&d<=r)
	{
   
		if(b[c]<=b[d])
			a[e++]=b[c++];
		else
			a[e++]=b[d++];
	}
	while(c<=mid)
		a[e++]=b[c++];
	while(d<=r)
		a[e++]=b[d++];
}
void mergesort(int a[],int n)
{
   
	int *b=new int[n];
	for (int i=0;i<n;i++)
		b[i]=a[i];//注意,先把辅助数组的所有东西和原来的数组弄成一样的。
	merge(a,b,0,n-1);
	delete[] b;
}

然后经典快速排序相信大家都深入骨髓了(但是我没有,我一直是用c++的库的哈哈)

void quicksort(int a[],int l,int r)
{
   
	if (l>r)return;
	int i = l;
	int j = r;
	int base = a[l];
	while(i != j) {
   
		while(a[j] >= base && i<j) {
   
			j--;
		}

		while(a[i] <= base && i<j) {
   
			i++;
		}
		
		if(i<j) {
   
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值