排序:归并排序

原创 2016年06月01日 22:35:47

1.概述

采用分治策略,将问题分为一些小的问题然后递归求解,而治的阶段则是将分的阶段解得各个答案合并在一起。现将一个序列分为只有1,2元素的子序列,然后两两合并。

2.实现

对一个具有N个元素的数组进行归并排序

void Merge_sort(int A[],int N)
{
	int *dstArray;
	dstArray=(int*)malloc(N*sizeof(int));
	if(dstArray!=NULL)
	{
		Msort(A,dstArray,0,N-1);
		free(dstArray);
	}
	else
		printf("no space!");
}

将问题分为很多小的问题递归求解,注意边界条件

void Msort(int A[],int dstArray[],int left,int right)
{
	int center;
	if(left<right)
	{
		center=(left+right)/2;
		Msort(A,dstArray,left,center);
		Msort(A,dstArray,center+1,right);
		Merge(A,dstArray,left,center+1,right);
	}
}

lpos表示是左半部分的开始,rpos表示右半部分的开始,rend表示右半部分的结束,最后的结果还是存在A里面,dstArray只是临时使用。

void Merge(int A[],int dstArray[],int lpos,int rpos,int rend)
{
	int lend=rpos-1;
	int num=rend-lpos+1;
	int tmpos=lpos;
	while(lpos<=lend&&rpos<=rend)
		if(A[lpos]<=A[rpos])
			dstArray[tmpos++]=A[lpos++];
		else
			dstArray[tmpos++]=A[rpos++];
	while(lpos<=lend)//右半部分先读完
		dstArray[tmpos++]=A[lpos++];
	while(rpos<=rend)//左半部分先读完
		dstArray[tmpos++]=A[rpos++];
	//不能用lpos来遍历,因为lpos已经变化了
	for(int i=0;i<num;i++,rend--)
		A[rend]=dstArray[rend];

}
3.分析

运行时间是:Time=O(NlgN),因为有数组的拷贝,所以占用内存。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

数据结构归并排序问题

  • 2017年07月17日 20:23
  • 3KB
  • 下载

二路归并排序

  • 2015年06月06日 23:21
  • 38KB
  • 下载

白话经典算法系列之五 归并排序的实现(讲的真好)

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较...

递归归并排序算法

  • 2017年11月02日 22:33
  • 2KB
  • 下载

归并排序算法

  • 2013年10月27日 09:56
  • 5KB
  • 下载

海量数据处理之分而治之/hash映射 + hash统计 + 堆/快速/归并排序

本章和后面的几章我将对海量数据和其处理的方法进行一些总结,很多内容转自博文http://blog.csdn.net/v_july_v/article/details/7382693 何谓海量数据处理...

归并排序算法代码实现

  • 2012年11月15日 19:20
  • 2KB
  • 下载

归并排序(C++语言描述)

  • 2013年11月09日 15:54
  • 1KB
  • 下载

图解归并排序算法(java版)

归并排序:采用分治法的思想(递归),将整个数组序列分成两个序列,再讲两个序列分成各自的子序列,采用递归的思想解决一个个的子问题。归并排序的时间复杂度:O(n*lgn) 归病排序的空间复杂度:O(n)...

归并排序动画可运行jar

  • 2013年04月27日 18:45
  • 11KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序:归并排序
举报原因:
原因补充:

(最多只允许输入30个字)