归并排序


一个归并排序的例子:对一个随机点的链表进行排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。算法时间复杂度位O(nlogn).

归并操作:

归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

算法描述:

1.设定两个指针,最初位置分别为两个已经排序序列的起始位置

2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

3.重复步骤3直到某一指针达到序列尾

4.将另一序列剩下的所有元素直接复制到合并序列尾

归并排序:

归并排序具体工作原理如下(假设序列共有n个元素):

1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素

2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素

3.重复步骤2,直到所有元素排序完毕


代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<climits>
#include<cstdlib>
using namespace std;

void merge(int *a, int low, int mid, int high) //归并操作
{
	int k, begin1, begin2, end1, end2;
	begin1 = low;
	end1 = mid;
	begin2 = mid + 1;
	end2 = high;
	int *t = (int *) malloc((high - low + 1) * sizeof(int));

	for(k = 0; begin1 <= end1 && begin2 <= end2; ++k) //自小到大排序
	{
		if(a[begin1] <= a[begin2])
			t[k] = a[begin1++];
		else
			t[k] = a[begin2++];
	}

	if(begin1 <= end1) //左剩
		memcpy(t + k, a + begin1, (end1 - begin1 + 1) * sizeof(int));
	else //右剩
		memcpy(t + k, a + begin2, (end2 - begin2 + 1) * sizeof(int));

	memcpy(a + low, t, (high - low + 1) * sizeof(int)); //排序后复制到原数组
	free(t); //释放空间
}

void merge_sort(int *a, unsigned int begin, unsigned int end)
{
	int mid;
	if(begin < end)
	{
		mid = (end + begin) / 2;
		merge_sort(a, begin, mid);
		merge_sort(a, mid + 1, end);
		merge(a, begin, mid, end);
	}
}

int main()
{
	int a[10];
	for(int i = 0; i < 10; ++i)
		cin>>a[i];
	merge_sort(a, 0, 9);
	for(int i = 0; i < 10; ++i)
		cout<<a[i]<<" ";
	cout<<endl;
}


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值