6-2 Iterative Mergesort

该博客介绍了一种不使用递归的迭代方法来实现归并排序。通过不断合并相邻的子列表,直到得到一个完全排序的列表。提供的示例程序展示了如何在C语言中实现这个过程,并给出了输入和输出示例。

摘要生成于 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 list and 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 )
{
   int m=0,i=0,j=i+length;
   int flag1,flag2;
   while(i<N)
   {
       flag1=j;
       flag2=i+2*length;
       while(i<flag1&&j<flag2&&j<N)
       {
         if(list[i]<=list[j])
            sorted[m++]=list[i++];
         else
            sorted[m++]=list[j++];
       }
       while(i<flag1)
          sorted[m++]=list[i++];
       while(j<flag2&&j<N)
           sorted[m++]=list[j++];
       i=flag2;
       j=i+length;
   }
}

merge_sort()是一种常用的排序算法,它采用分治法的思想,将一个大问题分解为多个小问题来解决。具体步骤如下: 1. 分解:将待排序的数组不断地二分,直到每个子数组只有一个元素。 2. 合并:将相邻的两个子数组按照顺序合并,形成一个有序的子数组。 3. 重复合并:不断地重复合并相邻的子数组,直到最终得到一个完全有序的数组。 下面是C++中merge_sort()函数的一个示例实现: ```cpp // 合并两个有序数组 void merge(int arr[], int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 int L[n1], R[n2]; // 将数据复制到临时数组 for (int i = 0; i < n1; i++) { L[i] = arr[left + i]; } for (int j = 0; j < n2; j++) { R[j] = arr[mid + 1 + j]; } // 合并临时数组 int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // 复制剩余元素 while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } // 归并排序 void merge_sort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; // 分解为子问题 merge_sort(arr, left, mid); merge_sort(arr, mid + 1, right); // 合并子问题的解 merge(arr, left, mid, right); } } ``` 这是一个递归实现的merge_sort()函数,它通过不断地将数组分解为更小的子数组,并将它们合并成有序数组来完成排序。你可以调用merge_sort()函数来对一个整数数组进行排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空不见云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值