归并排序

原创 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>

相关文章推荐

数据结构归并排序问题

  • 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个字)