#if 0
Input:5 2 4 7 1 3 2 6
#endif
#if 1
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
using namespace std;
template <typename T>
int insertionSort( T* data, int n );
template <typename T>
void mergenceSort( T *data, int n );
template <typename T>
void mergeSort_Better( T data[], int n );
template <typename T>
void mergePass_Better( T x[], T y[], int s, int n );
template <typename T>
void merge_Better( T x[], T y[], int l, int m, int r );
int main( void )
{
vector<int> vecT;
int data;
while( cin >> data ){
vecT.push_back( data );
}
//mergenceSort<int>( &vecT[0], vecT.size() );
//insertionSort<int>( &vecT[0], vecT.size() );
mergeSort_Better( &vecT[0], vecT.size() );
for( vector<int>::iterator it = vecT.begin();
it != vecT.end(); ++it ){
cout << *it << " ";
}
cout << endl;
return 0;
}
template <typename T>
int insertionSort( T* data, int n )
{
if( data == NULL || n <= 0 )
return -1;
for( int i = 1; i < n; ++i ){
T key = data[i];
int j = i - 1;
for( ; j >= 0 && key < data[j]; --j ){
data[j + 1] = data[j];
}
data[j + 1] = key;
}
return 0;
}
//*****************二路归并——归并-->复制**********************
template <typename T>
void mergeArray( T *data, int nLeft, int nMid, int nRight, T *outData )
{
int nLLoc, nRLoc, nLocOut;
nLLoc = nLeft;
nRLoc = nMid + 1;
nLocOut = nLeft;
while( nLLoc <= nMid && nRLoc <= nRight ){
if( data[nLLoc] <= data[nRLoc] ){
outData[nLocOut++] = data[nLLoc++];
}else{
outData[nLocOut++] = data[nRLoc++];
}
}
if( nLLoc <= nMid ){
while( nLLoc <= nMid )
outData[nLocOut++] = data[nLLoc++];
}else if( nRLoc <= nRight ){
while( nRLoc <= nRight )
outData[nLocOut++] = data[nRLoc++];
}
// 复制
for( int i = nLeft; i <= nRight; ++i )
data[i] = outData[i];
}
template <typename T>
void mergenceSortRec( T *data, int nLeft, int nRight, T *outData )
{
if( nLeft == nRight ){
return;
}else{
int nMid = ( nLeft + nRight ) / 2;
mergenceSortRec( data, nLeft, nMid, outData );
mergenceSortRec( data, nMid + 1, nRight, outData );
// 合并子程序
mergeArray( data, nLeft, nMid, nRight, outData );
}
}
template <typename T>
void mergenceSort( T *data, int n )
{
T *outData = new T[n];
mergenceSortRec( data, 0, n - 1, outData );
delete [] outData;
}
//*****************二路归并——归并复制优化**********************
template <typename T>
void mergeSort_Better( T a[], int n )
{// 使用归并排序算法对a[0:n-1]进行排序
T *b = new T[n];
int s = 1;
while( s < n ){
mergePass_Better( a, b, s, n );
//for( int i = 0; i < n; ++i )
// cout << b[i] << " ";
//cout << endl;
s <<= 1;// HIS ERROR:曾经s <<= 2;实际变成4倍
mergePass_Better( b, a, s, n );
s <<= 1;
//for( int i = 0; i < n; ++i )
// cout << a[i] << " ";
//cout << endl;
}
delete [] b;
}
template <typename T>
void mergePass_Better( T x[], T y[], int s, int n )
{// merge 大小为s的相邻段
int left = n, i = 0;// 初始位置
while( i + 2 * s <= n ){
merge_Better( x, y, i, i + s - 1, i + 2 * s - 1 );
i += s << 1;
}
if( i + s < n ){
merge_Better( x, y, i, i + s - 1, n - 1 );
}else{
for( ; i < n; ++i ){
y[i] = x[i];
}
}
}
template <typename T>
void merge_Better( T x[], T y[], int l, int m, int r )
{// merge x[l:m] and y[m+1:r]
int i = l,
j = m + 1,
k = l;
while( i <= m && j <= r ){
if( x[i] <= x[j] )
y[k++] = x[i++];
else
y[k++] = x[j++];
}
if( i <= m ){
while( i <= m )
y[k++] = x[i++];
}else{
while( j <= r )
y[k++] = x[j++];
}
}
#endif
分而治之 排序算法(归并排序算法)伪代码——
template <typename T>
void mergeSort( T a[], int left, int right )
{// 对a[left:right]中的元素进行排序
if( left < right ){
int i = ( left + right ) / 2;
mergeSort( a, left, i );
mergeSort( a, i + 1, right );
merge( a, b, left, i, right );// 从a合并到b
copy( b, a, left, right );// 结果放回a
}
}