排序5之归并排序

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

如 设有数列{6,202,100,301,38,8,1}

  初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数

  i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3

  i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4

  i=3 [ 1 6 8 38 100 202 301 ] 4

  总计: 11次

#include <stdio.h>
#include <string.h>
#define N 10
int b[N];
void ms(int l,int r,int *a)
{
    if(l>=r)
     return;
    int m=(l+r)/2;
    ms(l,m,a);
    ms(m+1,r,a);
    int i=l,j=m+1,s=l,bi=l;
    while(i<=m||j<=r) // 以下是归并的实现
    {
        if(j>r||i<=m&&a[i]<=a[j])
          b[bi++]=a[i++];
        else
          b[bi++]=a[j++];
    }
    for(s=l;s<=r;s++)//这个不能漏掉噢
      a[s]=b[s];
}
int main()
{
    int a[N];
    int i;
    for(i=0;i<N;i++)
      scanf("%d",&a[i]);
    ms(0,N-1,a);
    for(i=0;i<N;i++)
      printf("%d ",a[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/heqinghui/p/2615764.html