#include <iostream>
#include <cassert>
using namespace std;
void MergeTwoArr(int *pData, int *pTempData,int left,int mid,int right)
{
// left - mid
// mid+1 -right
int *pl= &pData[left] ;
int *pr= &pData[mid+1];
int size=right-left+1;
int offset=0;
while(offset<size)
{
if( pl > &pData[mid] && pr<=&pData[right] )
pTempData[offset++] = *pr++ ;
else if( pl<= &pData[mid] && pr>&pData[right])
pTempData[offset++] = *pl++ ;
else
pTempData[offset++] = *pl > *pr ? *pr++ : *pl++;
}
}
void MergeSortCore(int *pData,int *pTempData, int left,int right)
{
if(left<right)
{
int mid=left+ ( (right-left)>>1 ) ;
MergeSortCore(pData,pTempData,left,mid);
MergeSortCore(pData,pTempData,mid+1,right);
MergeTwoArr(pData,pTempData,left,mid,right);
memcpy( &pData[left],pTempData,(right-left+1)*sizeof(int) );
}
}
void MergeSort(int *pData, int n)
{
assert( pData!=NULL && n>0 );
int left=0, right=n-1;
int *pTempData=new int[n];
assert(pTempData!=NULL);
MergeSortCore(pData,pTempData,left,right);
delete [] pTempData;
}
void print(int *pData, int n)
{
assert(pData!=NULL && n>0);
for(int i=0;i<n;++i)
cout<<pData[i]<<" ";
cout<<endl;
}
int main()
{
int pData[]={16,3,5,43,9,6,-36,100};
MergeSort(pData,sizeof(pData)/sizeof(int) );
print(pData,sizeof(pData)/sizeof(int) );
return 0;
}
#include <cassert>
using namespace std;
void MergeTwoArr(int *pData, int *pTempData,int left,int mid,int right)
{
// left - mid
// mid+1 -right
int *pl= &pData[left] ;
int *pr= &pData[mid+1];
int size=right-left+1;
int offset=0;
while(offset<size)
{
if( pl > &pData[mid] && pr<=&pData[right] )
pTempData[offset++] = *pr++ ;
else if( pl<= &pData[mid] && pr>&pData[right])
pTempData[offset++] = *pl++ ;
else
pTempData[offset++] = *pl > *pr ? *pr++ : *pl++;
}
}
void MergeSortCore(int *pData,int *pTempData, int left,int right)
{
if(left<right)
{
int mid=left+ ( (right-left)>>1 ) ;
MergeSortCore(pData,pTempData,left,mid);
MergeSortCore(pData,pTempData,mid+1,right);
MergeTwoArr(pData,pTempData,left,mid,right);
memcpy( &pData[left],pTempData,(right-left+1)*sizeof(int) );
}
}
void MergeSort(int *pData, int n)
{
assert( pData!=NULL && n>0 );
int left=0, right=n-1;
int *pTempData=new int[n];
assert(pTempData!=NULL);
MergeSortCore(pData,pTempData,left,right);
delete [] pTempData;
}
void print(int *pData, int n)
{
assert(pData!=NULL && n>0);
for(int i=0;i<n;++i)
cout<<pData[i]<<" ";
cout<<endl;
}
int main()
{
int pData[]={16,3,5,43,9,6,-36,100};
MergeSort(pData,sizeof(pData)/sizeof(int) );
print(pData,sizeof(pData)/sizeof(int) );
return 0;
}