算法设计-自底向上合并排序法 (非递归)

版权声明:未经原作者允许不得转载本文内容,否则将视为侵权 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;
}

猜你喜欢

转载自blog.csdn.net/springhammer/article/details/88559172