408复习-数据结构-归并排序

学习目标:

理解和实现归并排序算法


1.归并排序描述

(1)使用分治法的思想
(2)使用递归算法的将数组划分成两个子数组,当划分长度为1的时候就天然有序,就可以回溯回去了,接着堆两个数组进行排序
(3)将两个有序数组进行排序

2.代码实现

//合并操作函数 参数(arr:待排序数组,low:数组最左下标,mid:中间划分下标,high:最高下标,high:辅助数组!用于临时存放待排序子数组)
//B和arr的长度是一样的
void merge(vector<int>& arr, int low, int mid, int high,vector<int>&B) {
	int i, j, k;
	//将arr数组的low到high部分复制到辅助数组
	for (i = low; i <= high; ++i) {
		B[i] = arr[i];
	}
	//[low,mid]属于左数组,[mid+1,high]属于有数组
	i = low, j = mid + 1, k = low;
	//当两个下标都没超过数组范围最大值时候就需要比较两个数组对应内容
	while (i<=mid&&j<=high) {
		if (B[i] > B[j]) {
			arr[k++] = B[j++];
		}
		else {
			arr[k++] = B[i++];
		}
	}
	//左数组还没存放完
	while (i <= mid) {
		arr[k++] = arr[i++];
	}
	//右数组还没有存放完
	while (j <= high) {
		arr[k++] = arr[j++];
	}
}
//排序函数 参数(arr:待排序数组,low:最左下标,high:最右下标,B:辅助数组!!需要和arr一样长)
void sort(vector<int>&arr,int low,int high,vector<int>&B) {
	//最小子数组只要划分到长度为1即可
	if (low < high) {
		//求出划分子数组的下标
		int mid = (high + low) / 2;
		cout << "mid:" << mid << endl;
		//给左子树组递归排序
		sort(arr, low, mid,B);
		//给右子数组递归排序
		sort(arr, mid + 1, high,B);
		//合并左右两个数组
		merge(arr, low, mid, high,B);
	}
}

	void test() {
		vector<int>arr{ 1,5,3,7,9,4,6,8,2,10 };
		vector<int>B(arr.size());
		sort(arr, 0, arr.size() - 1, B);
		print(arr);
	}

3.总结

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mystic Musings

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

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

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

打赏作者

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

抵扣说明:

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

余额充值