#include <iostream>
using namespace std;
//----------------------------------------------------------
// 归并排序(递归实现)
// 将有二个有序数列data[first...mid]和data[mid...last]合并
void Merge(int data[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (data[i] <= data[j])
temp[k++] = data[i++];
else
temp[k++] = data[j++];
}
while (i <= m)
temp[k++] = data[i++];
while (j <= n)
temp[k++] = data[j++];
for (i = 0; i < k; i++)
data[first + i] = temp[i];
}
void RecursiveMergeSort(int data[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
RecursiveMergeSort(data, first, mid, temp); // 左边有序
RecursiveMergeSort(data, mid + 1, last, temp); // 右边有序
Merge(data, first, mid, last, temp); // 再将二个有序数列合并
}
}
bool MergeSort(int data[], int count)
{
int * buffer = new int[count];
if (buffer == NULL)
return false;
RecursiveMergeSort(data, 0, count - 1, buffer);
delete[] buffer;
return true;
}
//----------------------------------------------------------
// 归并排序(非递归实现)
// 将data[]中相邻长度为step的子序列两两归并到temp[]
void MergePass(int data[],int temp[],int step, int count)
{
int i = 0;
while(i < count - 2*step)
{
Merge(data, i, i + step - 1, i + 2*step - 1, temp); // 两两归并
i = i + 2*step;
}
if(i < count - step) // 归并最后两个序列
Merge(data, i, i + step - 1, count - 1, temp);
}
bool MergeSort2(int data[], int count)
{
int * buffer = new int[count];
if (buffer == NULL)
return false;
int step = 1;
while(step < count)
{
MergePass(data, buffer, step, count);
step *= 2; // 子序列长度加倍
}
delete[] buffer;
return true;
}
int main()
{
int array[] = {9, 6, 3, 8, 7, 1, 5, 2, 4};
int count = sizeof(array) / sizeof(array[0]);
// MergeSort(array, count);
MergeSort2(array, count);
for(int i = 0; i < count; ++i)
cout << array[i] << " ";
cout << endl;
return 0;
}