6-2 Iterative Mergesort (25 分)

本文介绍了一种不使用递归的归并排序算法实现方法,通过迭代的方式将多个已排序的子列表合并成一个完全排序的列表。文章详细解释了算法的工作原理,并提供了一个具体的函数merge_pass,用于执行归并排序的合并过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

How would you implement mergesort without using recursion?

The idea of iterative mergesort is to start from N sorted sublists of length 1, and each time to merge a pair of adjacent sublists until one sorted list is obtained. You are supposed to implement the key function of merging.

Format of functions:

void merge_pass( ElementType list[], ElementType sorted[], int N, int length );

The function merge_pass performs one pass of the merge sort that merges adjacent pairs of sublists from list into sortedN is the number of elements in the listand length is the length of the sublists.

Sample program of judge:

#include <stdio.h>

#define ElementType int
#define MAXN 100

void merge_pass( ElementType list[], ElementType sorted[], int N, int length );

void output( ElementType list[], int N )
{
    int i;
    for (i=0; i<N; i++) printf("%d ", list[i]);
    printf("\n");
}

void  merge_sort( ElementType list[],  int N )
{
    ElementType extra[MAXN];  /* the extra space required */
    int  length = 1;  /* current length of sublist being merged */
    while( length < N ) { 
        merge_pass( list, extra, N, length ); /* merge list into extra */
        output( extra, N );
        length *= 2;
        merge_pass( extra, list, N, length ); /* merge extra back to list */
        output( list, N );
        length *= 2;
    }
} 


int main()
{
    int N, i;
    ElementType A[MAXN];

    scanf("%d", &N);
    for (i=0; i<N; i++) scanf("%d", &A[i]);
    merge_sort(A, N);
    output(A, N);

    return 0;
}

/* Your function will be put here */

Sample Input:

10
8 7 9 2 3 5 1 6 4 0

Sample Output:

7 8 2 9 3 5 1 6 0 4 
2 7 8 9 1 3 5 6 0 4 
1 2 3 5 6 7 8 9 0 4 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
void merge_pass( ElementType list[], ElementType sorted[], int N, int length ){
    for (int i=0; i<N; i=i+2*length) {
        int p1,p2,p3;
        p1=i;
        p2=i+length;
        p3=p1;
        while (p1<i+length&&p2<i+length+length&&p1<N&&p2<N) {
            if(list[p1]<list[p2]){
                sorted[p3]=list[p1];
                p3++;
                p1++;
            }
            else{
                sorted[p3]=list[p2];
                p3++;
                p2++;
            }
        }
        if(p1==i+length){
            while (p2<i+length+length) {
                sorted[p3]=list[p2];
                p3++;
                p2++;
            }
        }
        if(p2==i+length+length){
            while (p1<i+length) {
                sorted[p3]=list[p1];
                p3++;
                p1++;
            }
        }
        if(p2>=N){
            while (p1<i+length) {
                sorted[p3]=list[p1];
                p3++;
                p1++;
            }
        }
        if(p1>=N){
            while (p2<i+length) {
                sorted[p3]=list[p2];
                p3++;
                p2++;
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值