归并排序

归并排序还是比较好理解的。归并的含义是将两个或者两个以上的有序表组合成一个新的有序表。
具体方式是:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到若干长度为2或者1的有序子序列,再两两归并。。。直至得到一个长度为n的有序序列为止,这就称之为2路归并排序。

复杂度 :归并排序的最好最坏和平均时间复杂度都是O(n*logn),但是需要额外的长度为n的辅助数组。另外它是几个高效排序算法(快速排序、堆排序、希尔排序)中唯一稳定的排序方法。

实现:

/*
归并排序
by Rowandjj
2014/7/24
*/
#include<iostream>
using namespace std;
#define MAX 100
void Merge(int *list1,int *list2,int list1_size,int list2_size)
{
	int temp[MAX];//辅助数组
	int i,j,k;
	i = j = k = 0;
	//合并两个有序数组的操作,由于这里使用了辅助数组,故而可以从前向后复制
	//在之前的一篇文章中介绍合并有序数组采用的是从后向前复制,那是由于不使用辅助空间,而且数组1足够大
	while(i < list1_size && j < list2_size)
	{
		if(list1[i] < list2[j])
		{
			temp[k++] = list1[i++];
		}else
		{
			temp[k++] = list2[j++];
		}
	}
	while(i < list1_size)
	{
		temp[k++] = list1[i++];
	}
	while(j < list2_size)
	{
		temp[k++] = list2[j++];
	}
	//将已经排好序的辅助数组元素复制到源数组上
	for(i = 0; i < list1_size+list2_size; i++)
	{
		list1[i] = temp[i];
	}
}
void MergeSort(int arr[],int len)
{
	if(arr == NULL || len <= 1)
	{
		return;
	}
	int *list1 = arr;
	int list1_size = len/2;
	int *list2 = arr+list1_size;
	int list2_size = len - list1_size;
	MergeSort(list1,list1_size);//对左侧递归进行归并操作
	MergeSort(list2,list2_size);//对右侧递归进行归并操作
	Merge(list1,list2,list1_size,list2_size);
}
int main()
{
	int arr[] = {9,8,5,3,7,2,1,0,4};
	MergeSort(arr,9);
	for(int i = 0; i < 9; i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl;
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值