归并排序

所谓的归并 就是将两个或两个以上的有序子列合并成一个有序的子列;
想要把打合并成有序子列就得先把它分成若干个子列,每个子列是有序的,然后再把它合并为整体有序;
.主要是把这个数列 二分,递归的调用自身,知道二分到最后一个。然后把有序的一层一层的返回到 上一层没一层执行后就都是有序的了! 知道合并到最后可以执行的简单代码
代码:

#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#define MAX 255
int R[MAX];
void Merge(int low ,int middle ,int high)  //此函数是合并有序的子列
{
    int i = low ,j = middle + 1,p = 0;
    int *R1;

    R1 = (int *)malloc((high - low + 1)*sizeof(int));
    if(!R1)
    {
        printf("输入有误!\n");
        exit(0);
    while( i <= middle && j <= high) //把大的存到中间数组R1里;
    {
        R1[p++] = (R[i] < R[j] ? R[i++] : R[j++]);
    }


    while( i <= middle)//当有剩余的 i 段数组,在R1的后面 加上;
    {
        R1[p++] = R[i++];
    }
    while( j <= high)//当有剩余的j段数组;
    {
        R1[p++] = R[j++];
    }


    for( i = low,p = 0; i <= high; i++,p++)
    {
        R[i] = R1[p];
    }
}


void Merger_SortDC(int low ,int high) //用二分法,进行归并,递归地进行二分 知道最后剩下一个元素进行返回;
{ //返回后逐层的 进行归并排序;
int middle;
if( low < high)
{
middle = (low + high)/2;
Merger_SortDC(low,middle);
Merger_SortDC(middle+1,high);

Merge(low,middle,high);
}
}


int main()
{
int i,n;
printf("%请输入数据个数:");
scanf("%d",&n);


printf("请依次输入数据:\n");
for( i = 1 ; i <= n; i++)
{
scanf("%d",&R[i]);
}

printf("输入的数据为:\n");
for( i = 1; i <= n; i++)
{
printf("%4d",R[i]);
}

Merger_SortDC(1,n);
printf("\n排序后为:\n");
for( i = 1; i <= n ; i++)
{
printf("%4d",R[i]);
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值