优雅的归并排序算法和普通的归并排序算法

今天刷题时发现之前学习的归并排序算法是邓公的数据结构上的一种优化后的很优雅的归并排序算法,直接导致了我现在再看之前写的看不懂自己写的什么东西了。。。所以在此记录一下优雅的归并排序算法和普通的归并排序算法。

1.归并排序思路

  • 大概就是不断地将一个数组二分,直到所有的数组变成了单个数时return,然后在之后不断地排序两个两个的小数组,直到最后归并完成完成排序,其主体函数mergesort的常规操作如下:
	void mergesort(vector<int>& data, int lo, int hi)
	{
		if (hi - lo < 2)
			return;
		int mi = (lo + hi) / 2;
		mergesort(data, lo, mi);
		mergesort(data, mi, hi);
		merge(data, lo, mi, hi);
	}
  • 说穿了,就是mergesort自身用于不断地划分区间,而merge函数用于实现区间的排序功能(其中往往需要一个辅助数组来存储数据,并且说穿了就是左右两区间哪个小就往辅助数组里放,当某个区间的值用完后就直接另一个数组全部放入即可)。而对于merge函数而言,有优雅的实现和普通的实现两种。

2.普通的merge函数

	void merge(vector<int>& data, int lo, int mi, int hi)
	{
		//此处将i1作为temp的下标,i2作为数组data[lo, mi - 1]的下标,i3作为数组data[mi, hi - 1]的下标
		int temp_i1 = 0, left_i2 = lo, right_i3 = mi;
		vector<int> temp(hi - lo, 0);

		while (left_i2 < mi && right_i3 < hi)
		{
			if (data[left_i2] <= data[right_i3])
				temp[temp_i1++] = data[left_i2++];
			else 
				temp[temp_i1++] = data[right_i3++];
		}
		
		//当某个区间被换完后,用没换完的另一个区间补齐
		while (left_i2 < mi)
			temp[temp_i1++] = data[left_i2++];
		while (right_i3 < hi)
			temp[temp_i1++] = data[right_i3++];

		//将temp的数据赋值data实现排序更改
		for (int i = 0; i < hi - lo; i++)
			data[i + lo] = temp[i];
	}

3.优雅的merge函数

	void merge(vector<int>& data, int lo, int mi, int hi)
	{
		//此处将i1作为temp的下标,i2作为数组data[lo, mi - 1]的下标,i3作为数组data[mi, hi - 1]的下标
		int i1 = 0, i2 = lo, i3 = mi;
		int* temp = new int[hi - lo];
	
		while ((i2 < mi) || (i3 < hi))
		{
			if ((i2 < mi) && (!(i3 < hi) || (data[i2] <= data[i3])))
				temp[i1++] = data[i2++];
			if ((i3 < hi) && (!(i2 < mi) || (data[i2] > data[i3])))
				temp[i1++] = data[i3++];
		}

		for (int i = 0; i < hi - lo; i++)				
			data[i + lo] = temp[i];	
							
		delete[] temp;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

方寸间沧海桑田

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

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

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

打赏作者

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

抵扣说明:

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

余额充值