08-8.5.1 归并排序

👋 Hi, I’m @Beast Cheng
👀 I’m interested in photography, hiking, landscape…
🌱 I’m currently learning python, javascript, kotlin…
📫 How to reach me --> 458290771@qq.com


喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻
感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏

定义

合并:把两个或多个已经有序的序列合并成一个

设置三个指针 i , j , k i,j,k i,j,k ,对比 i , j i,j i,j所指元素,选择一个更小的放入 k k k 所指的位置

只剩一个子表未合并时,可以将该表中剩余元素全部加到总表

二路归并

也就是上面的过程↑:二合一

四路归并

设置五个指针 p 1 , p 2 , p 3 , p 4 , k p_1,p_2,p_3,p_4,k p1,p2,p3,p4,k ,对比 p 1 , p 2 , p 3 , p 4 p_1,p_2,p_3,p_4 p1,p2,p3,p4 所指元素,选择一个更小的放入 k k k 所指位置

四路归并 —— 每选出一个小元素需要对比关键字3次

代码实现

int *B = (int *) malloc (n * sizeof(int));  // 辅助数组B

// A[low...mid]和A[mid+1,...,high]各自有序,将两个部分合并
void Merge(int A[], int low, int mid, int high){
	int i, j, k;
	for(k = low; k <= high; k++)
		B[k] = A[k];  // 将A中所有元素复制到B中
	for(i = low, j = mid + 1, k = i; i <= mid && j <= high; k++){
		if(B[i] <= B[j])
			A[k] = B[i++];  // 将较小的值复制到A中
		else
			A[k] = B[j++];
	}
	while(i <= mid) A[k++] = B[i++];
	while(j <= high) A[k++] = B[j++];
}

void MergeSort(int A[], int low, int high){
	if(low < high){
		int mid = (low + high) / 2;  // 从中间划分
		MergeSort(A, low, mid);  // 对左半部分归并排序
		MergeSort(A, mid + 1, high);  // 对右半部分归并排序
		Merge(A, low, mid, high);  // 归并
	}
}

算法效率分析

2路冰柜的归并树,形态上就是一棵倒立的二叉树

结论
n个元素进行2路归并排序,归并趟数 = l o g 2 n =log_2n =log2n
每趟归并时间复杂度为 O ( n ) O(n) O(n),则算法时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
空间复杂度 = O ( n ) =O(n) =O(n),来自辅助数组B

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Beast Cheng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值