版权声明:未经原作者允许不得转载本文内容,否则将视为侵权 https://blog.csdn.net/springhammer/article/details/88559172
自底向上合并排序法 (非递归)
#include <stdio.h>
#include <stdlib.h>
#define LEN 10
// merge_sort(): 非递归实现-自底向上
// 将原数组划分为left[min...max] 和 right[min...max]两部分
void BottomUpSort(int *list, int length)
{
int i, left_min, left_max, right_min, right_max, next;
int *tmp = (int*)malloc(sizeof(int) * length);
if (tmp == NULL)
{
fputs("Error: out of memory\n", stderr);
abort();
}
for (i = 1; i < length; i *= 2) // i为步长,1,2,4,8……
{
for (left_min = 0; left_min < length - i; left_min = right_max)
{
right_min = left_max = left_min + i;
right_max = left_max + i;
if (right_max > length)
right_max = length;
next = 0;
while (left_min < left_max && right_min < right_max)
tmp[next++] = list[left_min] > list[right_min] ? list[right_min++] : list[left_min++];
while (left_min < left_max)
list[--right_min] = list[--left_max];
while (next > 0)
list[--right_min] = tmp[--next];
}
}
free(tmp);
}
int main(void)
{
int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6,9,8 };
int i;
printf("排序前的数据:");
for(int i=0; i<LEN; i++)
{
printf("%d ",a[i]);
}
BottomUpSort(a, LEN);
// print array
printf("\n");
printf("排序后的数据:");
for (i = 0; i < LEN; i++)
printf("%d ", a[i]);
return 0;
}