归并排序和基数排序

二路归并排序

将待排序列分为左右两个子序列,
分别递归进行排序。

void mergesort(elemtype A[], int low, int high)
{
	if(low<high)
	{
		int mid=(low+high)/2;
		mergesort(A[],low,mid-1);
		mergesort(A[],mid+1,high);
		merge(A[],low,mid,high);
	}
}

分配一个大小为n+1的辅助空间B[];
将所有的值复制到B[]上去。
比较两个子序列从前往后关键字的大小,
将小的那个复制到B中,同时该子序列指针往后移一位。

elemetype*B = (elemtype*)malloc((n+1)*sizeof(elemtype));
void merge(elemtype A[], int low, int mid ,int high)
{
	for(i=1; i<=n; i++)
		B[i]=A[i];
	for(m=low,t=mid+1,i=1;m<=mid&&t<=high; m++,i++)
	{
		if(B[m]<=B[t])
		{
			A[i]=B[m];
			m++;
		}
		else
		{
			A[i]=B[t];
			t++;
		}
	}
	while(m<=mid)
		A[i++]=B[m++];
	while(t<=high)
		A[i++]=B[t++];
}

时间复杂度:O(nlog2n)
进行log2n次合并,每次合并的时间复杂度为O(n)
空间复杂度:O(n)
稳定性: 稳定

基数排序

LSD低位优先排序。
每个关键字由d元组(d个数字组成)组成,其中组成元素的种类为r个(0到9用到了几种数字)。一共有n个关键字。
排序过程需要r个队列。
首先:队列置空,然后最后一元的数字与队列代表的数字进行匹配,将关键字放入队列。(分配)
然后:将r个队列首尾相连,组成一个新的结点序列。(收集)
一共需要进行d次分配收集,最后得到的序列即为有序序列。
空间复杂度:O®
一共需要r个队列,且这些队列可以重复使用。
时间复杂度:O(d(n+r))
一共需要d趟分配收集,分配所需时间O(n)
收集所需时间O®
稳定性: 稳定

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值