#include <iostream>
#include <assert.h>
using namespace std;
void myMerge(int a[], int from, int mid, int to)
{
assert(from <= mid && mid < to);
int* arr = new int[to-from+1];
assert(arr);
int i = from;
int j = mid + 1;
int index = 0;
while(i <= mid && j <= to)
arr[index++] = (a[i] < a[j] ? a[i++] : a[j++]);
/*
while(i <= mid && j <= to)
{
if(a[i] < a[j]) //指令流水,通常这个分支难以预测
arr[index++] = a[i++];
else
arr[index++] = a[j++];
}
*/
while(i <= mid)
arr[index++] = a[i++];
while(j <= to)
arr[index++] = a[j++];
for(int k=0; k < index; ++k)
a[from++] = arr[k];
delete[] arr;
arr = NULL;
}
void mergeSort(int a[], int from, int to)
{
if(from < to)
{
int middle = ((to - from) >> 1) + from;
mergeSort(a,from,middle);
mergeSort(a,middle+1,to);
myMerge(a,from,middle,to);
}
}
template <typename T, size_t num>
void output(T (&a)[num])
{
for(size_t t=0; t<num; ++t)
cout << a[t] << " ";
cout << endl;
}
int main()
{
const int len = 250000;
int a[len];
for(int i=0; i<len/2; ++i)
a[i] = i;
for(int i=len/2; i<len; ++i)
a[i] = len - i;
output(a);
mergeSort(a,0,len-1);
output(a);
return 0;
}