排序算法总结2

排序算法总结2

归并排序

今天我们来谈一下归并排序,归并排序对于初学者可能有一定的难度,因为它需要用到递归的思想。如果你对递归十分熟练的话,那么会对你理解归并排序有很大的帮助。
举个例子,6,2,1,4,3,5。对这个数组进行从大到小的排序。这时我们可以想一下,我们是否可以让左边三个数字先有序,也就是变成1,2,6.然后让右边三个数字有序,变成3,4,5。这样我们让这两个数组进行比较,如果小的先出列,然后比较下一项。最终获得结果,可是我们如何让左边的数组有序呢?那就是将左边数组再分一半,再按照上述套路进行排序,就这样层层递归下去,最终左侧的数组排好序,开始递归右边的数组。
如果不熟悉的同学可以画一下递归图,这样会让你对过程有清晰的认识。归并排序的时间复杂度为O(nlogn),额外空间为O(n).
下边我们看一下code

//归并排序
class Solution1
{
public:
	static vector<int> help;
	void mergesort(int l, int r, vector<int>& arr)
	{
		if (l == r)
			return;
		else
		{
			int mid = l + ((r - l) >> 1);
			mergesort(l, mid, arr);
			mergesort(mid + 1, r, arr);
			int left = l, right = mid+1,k=l;
			while (left <= mid && right <= r)
			{
				if (arr[left] <= arr[right])
					help[k++] = arr[left++];
				else
					help[k++] = arr[right++];
			}
			while (left <= mid)
				help[k++] = arr[left++];
			while (right <= r)
				help[k++] = arr[right++];
			for (int i = l; i <= r; i++)
				arr[i] = help[i];
		}
	}
	void MergeSort(vector<int>& arr)
	{
		int n = arr.size();
		help.resize(n);
		mergesort(0, n-1, arr);
	}

};
vector<int>Solution1::help;

明天我会讲解快速排序的内容 ,如果这篇博客对你有用的话,请各位看官帮忙点点赞。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值