非递归方式的归并排序
#include <stdio.h>
#include <stdlib.h>
const int N = 6;
// 将 a 的 0~half-1个元素 和 half~end个元素 有序的合并到 a2
void Merge(int* a, int* a2, int begin, int half, int end) {
int i=begin, i2=half, n=begin;
// 将已经有序的 begin~half 和有序的 half~end 合并到 a2形成 有序的 begin~end
while(i < half || i2 < end) {
if(i < half && (i2 == end || a[i] <= a[i2]))
a2[n++] = a[i++];
else
a2[n++] = a[i2++];
}
}
void MergeSort(int* data, int n) {
int* a = data;
int* a2 = (int*)malloc(N*sizeof(int));
for(int i=1; i < n; i*=2) {
for(int j=0; j<n; j+=2*i) {
Merge(a, a2, j, j+i<n ? j+i : n, j+2*i<n ? j+2*i : n);
}
int* p=a;
a=a2;
a2=p;
}
// 当结果在动态分配的内存中时须要再进行一次拷贝
if(data == a2) {
for(int i=0; i<n; i++) {
data[i] = a[i];
}
}
}
int main(void)
{
int arr[N] = {6, 2, 7, 10, 3, 9};
MergeSort(arr, N);
for(int i=0; i<N; i++) {
printf("%d ", (int)arr[i]);
}
return 0;
}