归并排序--思想与代码实现

        归并排序和快速排序是时间复杂度比较优秀的排序算法中比较常用的两个。本文将重点介绍归并排序的思想,并给出归并排序的常用代码模版。

归并排序的算法思想

        和快速排序的想法是类似的,他们都使用了分治的基本思想。归并排序的主要的思想是,对于一个长序列,我们先找到序列的中间点,先递归的排序左右两个短序列,然后利用双指针法合并左右两个有序的序列。思想上还是很好理解的。

        时间复杂度分析:由于每一段序列每次都会被分裂为两段,知道序列中只剩下一个元素为止,所以递归的层数为logn层,每一层我们都会利用双指针法完整的扫描整个序列,所以总体的时间复杂度为o(nlogn),是比较优秀的

归并排序的代码实现

int a[N], tmp[N]; //a为待排序的目标数组,tmp为辅助数组
void merge_sort(int l , int r)
{
	if (l >= r) return;
	int i = l, mid = l + r >> 1, j = mid + 1 ,k = l;
	merge_sort(l, mid), merge_sort(j, r);  //先递归左右两个子区间

	while (i <= mid && j <= r)
	{
		if (a[i] <= a[j]) tmp[k++] = a[i++];
		else tmp[k++] = a[j++];
	}
	while (i <= mid) tmp[k++] = a[i++];
	while (j <= r) tmp[k++] = a[j++];

	for (int i = l; i <= r; i++) a[i] = tmp[i];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值