归并排序

归并排序

基本思想:

将一个数组按步骤分为若干个不可分的小数组
然后对小数组进行简单的排序
再按照步骤一步步合并各个小数组并且保持有序状态

步骤:

  • 1.将数组A[0…n-1] 分成两个相等数组,并分别用数组B和数组C备份
  • 2.分别对B,C进行排序
  • 3.按照如下方法合并B,C到数组A :
    • 重复如下步骤,直到数组中没有元素为止 :
      • 比较两个待合并数组的第一个元素
      • 将较小的元素添加到一个新创建的数组中,被复制数组中下标后移。
    • 在未处理完的数组中,剩下的元素被复制到新创建数组的尾部。

比较直观的图:

在这里插入图片描述
资料来源:学校老师的ppt

演示代码:

#include <stdio.h>
void hebing(int a[],int x1,int x2,int x3)    //自定义实现一次归并样序的函数
{
    int l[50],r[50];						//左右两个数组 
    int i,j,k;
    int long1=x2-x1+1,long2=x3-x2;         //左右上界 
    for( i=0;i<long1;i++){
    	l[i]=a[x1+i];
    }
    for( j=0;j<long2;j++){
    	r[j]=a[x2+j+1];
    }
    i=0;j=0;
     k = x1;
    while (i < long1 && j < long2) a[k++] = l[i] < r[j] ? l[i++] : r[j++];
    //正常情况 
    while (i < long1) a[k++] = l[i++];
    //左数组没遍历完 
    while (j < long2) a[k++] = r[j++];
    //右数组没遍历完 
}
void q(int a[],int op,int ed)//分区算法
{
    int mid;

    if(op<ed)
       
    {
        mid=(op+ed)/2;
        q(a,op,mid);    		  
        q(a,mid+1,ed);   		
        hebing(a,op,mid,ed);    
    }
   
}

int main()
{
    int a[100];					//定义一个数组
    int n;//数组长度
    int i;
    scanf("%d",&n);
    printf("请输入%d个数:\n",n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);   		 //从键盘中输入n个数
    q(a,1,n);   					 //调用函数进行归并排序
    printf("\n排序后的顺序是 :\n");
    for(i=1;i<=n;i++)
        printf("%6d",a[i]);   		 //输出排好序后的数据
    printf("\n");
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值