merge_sort归并排序

博客聚焦归并排序,介绍其作用、实现思想和步骤,并给出实现代码。归并排序是一种重要的排序算法,在信息技术领域的数据处理中有广泛应用。

归并排序

作用

使一个无序数组,变成一个从小到大或是从大到小的有序数组

归并排序实现思想

归并排序是基于分治的,和快速排序的实现步骤是刚好相反的,
归并排序是先进行递归后进行处理

归并排序的实现步骤

1. 选取中间点坐标 mid
2. 以中间点划分左右区间,进行递归
3. 该层,递归结束后说明,该层的左右区间q[l, mid]和 q[mid + 1, r]已经各自有序
4. 新开辟一个数组tmp[],同时在左右区间的最左端,各自设置一个指针,通过指针对应的数据比较
   将其有序的放入新数组中
5. 再将新数组tmp[] 中的值重新还给q[l, r]

实现代码

const int N = 1e6 + 10;
int tmp[N];

void merge_sort(int q[], int l, int r){
	if(l >= r) return;
	
	int mid = l + r >> 1;
	
	merge_sort(q, l, mid);
	merge_sort(q, mid + 1, r);
	
	int i = l, j = mid + 1, k = 0;
	while(i <= mid && j <= r){
		if(q[i] <= q[j]) tmp[k ++] = q[i ++];
		else tmp[k ++] = q[j ++];
	}
	
	while(i <= mid) tmp[k ++] = q[i ++];
	while(j <= r) tmp[k ++] = q[j ++];

	for(int i = l, j = 0; j < k;i ++, j ++){
		q[i] = tmp[j];
	}
	
}
`merge_sort` 函数是归并排序算法的核心函数,其主要作用是将一个无序的数组通过递归的方式进行排序。归并排序采用分治法的思想,将一个大问题分解为多个小问题来解决。 在代码 `merge_sort(arr, l, mid); merge_sort(arr, mid + 1, r);` 中,`merge_sort` 函数被递归调用两次。具体来说,这两行代码的作用是将数组 `arr` 从索引 `l` 到 `mid` 的部分和从索引 `mid + 1` 到 `r` 的部分分别进行排序。 以下是对这两行代码的详细解释: - `merge_sort(arr, l, mid);`:对数组 `arr` 中从索引 `l` 到 `mid` 的子数组进行归并排序。通过递归调用 `merge_sort` 函数,将这个子数组不断地二分,直到每个子数组只剩下一个元素或者为空,此时认为这些子数组已经是有序的。 - `merge_sort(arr, mid + 1, r);`:对数组 `arr` 中从索引 `mid + 1` 到 `r` 的子数组进行归并排序,同样是通过递归调用将子数组不断二分,使其变得有序。 以下是一个简化的 `merge_sort` 函数示例: ```python def merge(left, right): if not left: return right if not right: return left arr = [] i, j = 0, 0 while i < len(left) and j < len(right): if left[i] >= right[j]: arr.append(right[j]) j += 1 else: arr.append(left[i]) i += 1 arr += left[i:] arr += right[j:] return arr def merge_sort(arr): if not arr or len(arr) == 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) ``` 归并排序的时间复杂度为 $O(n log n)$,空间复杂度为 $O(n)$,是一种稳定的排序算法,适用于处理大规模数据。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值