# 归并排序

<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
• 2016年07月04日 15:09
• 2149

## 归并排序及代码实现

• chuchus
• 2014年03月22日 20:30
• 1389

## 归并排序及其应用

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

## 算法系列（四）排序算法中篇--归并排序和快速排序

• 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
• 2016年05月14日 13:47
• 802

## 归并排序（视频+详解+代码）

• dreamzuora
• 2016年10月16日 15:38
• 984

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

• prstaxy
• 2012年11月09日 14:31
• 17496

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

• zr1076311296
• 2016年05月22日 19:07
• 802

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

• Szu_AKer
• 2016年08月31日 23:49
• 461

## STL归并排序

#include #include #include #include #include #include #include #include #include #include #include #...
• bingsanchun1
• 2013年12月04日 23:48
• 9814

举报原因： 您举报文章：归并排序 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)