关于归并排序

本文详细介绍了归并排序算法的实现过程,并通过具体的代码示例进行了解释。重点讨论了如何解决排序过程中等号的问题,确保排序稳定性和正确性。

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

应该说早就知道了,但是一直没有实现,一般用快排的,但是今天实现时,问题还不少啊,主要是等号问题的

#include <stdio.h>
#include <stdlib.h>

void combine(int low,int high,int arr[])  //将两列有顺序的合并起来
{
    int i,j,m,n;
    int brr[30]={0};
    for(i=low;i<=high;i++)                             //将arr的值赋给brr
    {
        brr[i]=arr[i];
    }
    j=(low+high)/2;                                   //其中一个数组的上限
    n=j+1;                                             //另一数组的下限
    m=low;
    while(n<=high||low<=j)                            //n和low分别表示两个数组的变化指针
 {
    while((brr[low]>=brr[n]||low>j)&&n<=high)          //当前一个数组已经完了或都第一个当前
    {                                                 //小于第二个的当前取第一个的,注意等号。
        arr[m]=brr[n];
        n++;
        m++;
    }
    while((brr[low]<=brr[n]||high<n)&&low<=j)
    {
        arr[m]=brr[low];
        low++;
        m++;
    }
 }
}

void mergesort(int arr[],int low,int high)
{
    int t,i,j;
    if(high>low)
    {
        mergesort(arr,low,(high+low)/2);     //divide
        mergesort(arr,(high+low)/2+1,high);
        combine(low,high,arr);
    }
}

int main()
{
    int i ,n;
    int arr[30]={0};
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    mergesort(arr,0,n-1);
    for(i=0;i<n;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值