归并排序

原创 2016年05月31日 09:08:53
<span style="font-size:14px;"><span style="font-size:18px;">#include <iostream>
using namespace std;


int combineSort( int a[], int low, int high )
{
	int ret = 0;
	
	if( NULL == a || low > high )
	{
		cout << "combineSort func: err -1, NULL==a || low > high" << endl;
		ret = -1;
		return ret;
	}

	if( low == high )
	{
		return ret;	
	}

	int half = ( high + low ) / 2;

	int *pArray1 = new int[ half - low + 2 ];

	if( NULL == pArray1 )
	{	
		cout << "combineSort func: err -1, NULL == pArray1" << endl;
		ret = -1;
		return ret;	
	}

	int *pArray2 = new int[ high - half + 2 ];

	if( NULL == pArray2 )
	{
		cout << "combineSort func: err -1, NULL == pArray2" << endl;
		ret = -1;
		return ret;	
	}

	for( int i = low; i <= half; ++i )
	{
		pArray1[ i - low ] = a[i];
	}

	for( int i = half + 1; i <= high; ++i )
	{
		pArray2[ i - half - 1 ] = a[i];
	}

	
	combineSort( pArray1, 0, half - low );
	
	combineSort( pArray2, 0, high - half - 1 );
	
	int idx = low;
	int i = 0;
	int j = 0;

	//cout << "begin combine" << endl;

	for( i = 0, j = 0; i <= half - low && j <= high - half - 1; )
	{
		if( pArray1[i] < pArray2[j] )
		{
			a[ idx++ ] = pArray1[i];
			++i;
		}
		else 
		{
			a[ idx++ ] = pArray2[j];
			++j;
		}
	}
	

	while( i <= half - low )
	{
		a[ idx++ ] = pArray1[ i++ ];
	}

	while( j <= high - half - 1 )
	{
		a[ idx++ ] = pArray2[ j++ ];
	}

	/*

	for( int i = 0; i <= half - low; ++i )
	{
		cout << pArray1[i] << ' ';
	}
	cout << endl;

	for( int i = 0; i <= high - half - 1; ++i )
	{
		cout << pArray2[i] << ' ';
	}
	cout << endl;


	cout << "low=" << low << ",high=" << high << endl;

	for( int i = low; i <= high; ++i )
	{
		cout << a[i] << ' ';
	}
	cout << endl;*/

	
	delete []pArray1;
	pArray1 = NULL;
	delete []pArray2;
	pArray2 = NULL;

	return ret;
	
}


int merge( int source[], int dest[], int start, int mid, int end )
{
	int ret = 0;

	if( NULL == source || NULL == dest || start > mid || mid > end )
	{
		cout << "mergeSort func: err -1, NULL==source || NULL==dest || start > mid || mid > end " << endl;
		ret = -1;
		return ret;
	}

	int k = start;
	int i = 0;
	int j = 0;

	for( i = start, j = mid + 1; i <= mid && j <= end; )
	{
		if( source[i] < source[j] )
		{
			dest[ k++ ] = source[ i++ ];
		}
		else
		{
			dest[ k++ ] = source[ j++ ];	
		}
	}

	while( i <= mid )
	{
		dest[ k++ ] = source[ i++ ];
	}

	while( j <= end )
	{
		dest[ k++ ] = source[ j++ ];
	}

	for( int i = start; i <= end; ++i )
	{
		source[i] = dest[i];
	}

	return ret;
}

// ref: 归并排序 百度百科
int mergeSort( int source[], int dest[], int startIndex, int endIndex )
{
	int ret = 0;

	if( NULL == source || NULL == dest )
	{
		cout << "mergeSort func: err -1, NULL==source || NULL==dest " << endl;
		ret = -1;
		return ret;
	}

	if( startIndex < endIndex )
	{
		int midIndex = ( startIndex + endIndex ) / 2;
		mergeSort( source, dest, startIndex, midIndex );
		mergeSort( source, dest, midIndex + 1, endIndex );
		merge( source, dest, startIndex, midIndex, endIndex );
	}

	return ret;
}

// mergeSort只需O(n)空间,而combineSort需要nlog(n)的空间

int main()
{
	int ret = 0;

	int a[] = { 2, 3, 1, 4, 7, 6, 5 };
        int n = 0;
 
	while( cin >> n )
	{
		int *p = new int[n];
		int *p1 = new int[n];

		for( int i = 0; i < n; ++i )
		{
			int data = 0;
			cin >> p[i];
			
		}

		//combineSort( p, 0, n - 1 );
		mergeSort( p, p1, 0, n - 1 );
		cout << "after sort: " << endl;

		for( int i = 0; i < n; i++ )
		{
			cout << p[i] << ' ';
		}

		cout << endl;

		delete []p;
		p = NULL;
		
	}
	

	return ret;
}</span></span>

利用Python实现归并排序

在讲归并排序之前我们先来了解一下什么是分治算法。为什么归并排序属于分治算法的体现。 分治算法分治算法基本思想就是将一个比较大规模的问题分解成为若干个规模较小的问题来解决。这些小问题相当于是原问题的子集...
  • minxihou
  • minxihou
  • 2016年07月04日 15:09
  • 2149

归并排序及代码实现

自己实现归并排序+快速排序,二者都是嵌套加递归 归并排序: //归并排序 #include #include using namespace std; void merge_sort(i...
  • chuchus
  • chuchus
  • 2014年03月22日 20:30
  • 1389

归并排序及其应用

1 归并排序的特点归并排序是一种利用分治技术来实现一种稳定排序算法,该算法的时间复杂度为O(nlogn),该算法的常数因子比较大,通常应用于数据量比较大的场合。通常,我们所学习的归并排序算法都是二路归...
  • mitedu
  • mitedu
  • 2009年02月12日 16:22
  • 2921

算法系列(四)排序算法中篇--归并排序和快速排序

在算法系列(三)排序算法上篇 一文中,介绍了冒泡排序,插入排序和选择排序算法。这篇文章继续讲解排序算法。 概述 冒泡排序,插入排序和选择排序算法这些算法的时间复杂度都是O(N^2),是否有更高效的排序...
  • robertcpp
  • robertcpp
  • 2016年05月30日 23:04
  • 3387

【排序】归并排序(递归和非递归版本)

#include using namespace std; void merge(int* a, int* temp, int begin, int middle, int end){ int i...
  • ruan875417
  • ruan875417
  • 2016年05月14日 13:47
  • 802

归并排序(视频+详解+代码)

归并排序 概述:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到...
  • dreamzuora
  • dreamzuora
  • 2016年10月16日 15:38
  • 984

二路归并排序算法(递归&非递归)

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。 归并排序是建立在归并操作上的...
  • prstaxy
  • prstaxy
  • 2012年11月09日 14:31
  • 17496

[STL] List 中sort为什么采用归并排序

这几天在看STL(SGI版本----侯捷),在看完第一章后有点懵,但还是很震撼,STL的设计理念确实很好,至于有多么好我们都懂,所以就不再评价了。      由于刚刚开始看,所以有些东西并不是很透彻,...
  • zr1076311296
  • zr1076311296
  • 2016年05月22日 19:07
  • 802

八大内部排序 -- 归并排序

归并排序(merge-sort):将两个或两个以上的有序列表组合成一个新的有序表,合并的m,n长度的两个表的复杂度为O(m+n),n个数的序列进行归并共有ceil(logn)次,每一次合并都是n常数级...
  • Szu_AKer
  • Szu_AKer
  • 2016年08月31日 23:49
  • 461

STL归并排序

#include #include #include #include #include #include #include #include #include #include #include #...
  • bingsanchun1
  • bingsanchun1
  • 2013年12月04日 23:48
  • 9814
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:归并排序
举报原因:
原因补充:

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