书上归并排序大多都是采用分治的思想,结合递归方式实现,现采用非递归的方式实现,源码如下:
#include <iostream>
#include <cassert>
using namespace std;
void Merge(int *left, int *right, int *right_end)
{
int *left_end = right;
int *result = left;
int temp_size = right_end - left;
int *temp = new int[temp_size];
int i = 0;
while(left < left_end && right < right_end) {
if(*left > *right)
temp[i++] = *right++;
else
temp[i++] = *left++;
}
while(left < left_end)
temp[i++] = *left++;
while(right < right_end)
temp[i++] = *right++;
for(i = 0; i < temp_size; i++)
result[i] = temp[i];
delete[] temp;
}
void MergeSort(int *arr, int len)
{
assert(arr);
int curstep = 1;
while(curstep < len) {
for(int i = 0; i < len; i+= 2 * curstep) {
int *end = arr + i + 2 * curstep;
if(end > arr + len)
end = arr + len;
Merge(arr + i, arr + i + curstep, end);
}
curstep <<= 1;
}
}
int main()
{
int arr[] = {3, 8, 2, 6, 1, 4, 5};
int len = sizeof(arr) / sizeof(arr[0]);
MergeSort(arr, len);
for(int i = 0; i < len; i++)
cout << arr[i] << "\t";
cout << endl;
return 0;
}
运行结果: