8645 归并排序(非递归算法)

本文介绍了一种非递归的归并排序算法,详细解析了算法过程,包括如何设置每趟排序的元素数量m和分割份数d,并通过示例展示了每趟排序后的结果。代码实现中,通过Merge函数完成了两个有序区间的合并,并在Mergesort函数中实现了整个排序过程。最后,给出了输入和输出示例,便于理解算法的实际效果。
摘要由CSDN通过智能技术生成
8645 归并排序(非递归算法)
时间限制:1000MS  代码长度限制:10KB
提交次数:2398 通过次数:1192

题型: 编程题   语言: G++;GCC
Description
用函数实现归并排序(非递归算法),并输出每趟排序的结果



输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据


输出格式
每行输出每趟排序的结果,数据之间用一个空格分隔


输入样例
10
5 4 8 0 9 3 2 6 7 1


输出样例
4 5 0 8 3 9 2 6 1 7
0 4 5 8 2 3 6 9 1 7
0 2 3 4 5 6 8 9 1 7
0 1 2 3 4 5 6 7 8 9

m表示每一趟排序中归并多少个元素,第一趟为2,然后是4,8…
d表示有序表分成多少份,比如10个元素第一趟分成5份归并排序,每份m(2)个

#include <iostream>

using namespace std;

void Merge(int R[],int T[],int low,int mid,int high)//将有序表R[low...mid]和R[mid+1...high]合并成有序表
{
    int i=low,j=mid+1,k=low;
    while(i<=mid&&j<=high)//将R中记录由小到大并入T中
    {
        if (R[i]<R[j])
        {
            T[k++]=R[i++];
        }
        else T[k++]=R[j++];
    }
    while(i<=mid) T[k++]=R[i++];//将剩余的数据并入T[]中
    while(j<=high) T[k++]=R[j++];//将剩余的数据并入T[]中
}

void Mergesort(int A[],int n)
{
    int T[n+5]= {0},i,j,low,mid,high;
    int m=2,d;//m表示每一趟排序中归并多少个元素,第一趟为2,然后是4,8....
    //d表示有序表分成多少份,比如10个元素第一趟分成5份归并排序,每份m(2)个元素
    if (n%2!=0)
    {
        d=n/2+1;
    }else
    {
        d=n/2;
    }
    while(d>1)
    {
        if(m>n)
        {
            high=n;
        }
        else
        {
            high=m;
        }
//      printf("d=%d m=%d\n",d,m);
        for (low=1; low<=n;)
        {
            mid=(high+low)/2;
            Merge(A,T,low,mid,high);
//            printf("low=%d mid=%d high=%d\n",low,mid,high);
            low=low+m;
            high=high+m;
            if (high>n)
            {
                high=n;
            }
        }
        for (i=1; i<=n; i++)//将排序后数据复制到A[]中,以便进行下次排序
        {
            A[i]=T[i];
        }
        for (i=1; i<=n; i++)
        {
            printf("%d ",T[i]);
        }
        printf("\n");
        m=m*2;
        if (n%m!=0)
        {
            d=n/m+1;
        }
        else
        {
            d=n/m;
        }
    }
    Merge(A,T,1,m/2,n);
    for (i=1; i<=n; i++)
    {
        printf("%d ",T[i]);
    }
}

int main()
{
    int i,j,n;
    scanf("%d",&n);
    int A[n+5]={0};
    for (i=1; i<=n; i++)
    {
        scanf("%d",&A[i]);
    }
    Mergesort(A,n);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值