归并排序

归并排序的过程就是假设子数组A[p..q]和 A[q + 1 .. r ]都是排好序的,并将它们合并成一个已排好序的子数组代替当前数组A[p..r]。

这个过程是在函数MEGRE中实现。

MEGRESORT 函数是对子数组A[p..r]进行排序。若p >= r,则该子数组中至多只有一个元素,当然就是已排好序的。否则,分解步骤就计算出一个下表q,将a[p..r]分成a[p..q] 和a[q + 1..r],各含 >= n/2个元素。

 

 

#include <stdio.h>
#include <string.h>
const int MAXN = 100000000;

void MERGE ( int *a, int p, int q, int r ) {
     int n1 = q - p + 1;
     int n2 = r - q;
     int L[n1 + 1], R[n2 + 1];
     int i, j, k;
     for ( i = 1; i <= n1; ++i )
          L[i] = a[p + i - 1];
     for ( j = 1; j <= n2; ++j )
          R[j] = a[q + j];
     L[n1 + 1] = MAXN;
     R[n2 + 1] = MAXN;
     i = 1;
     j = 1;
     for ( k = p; k <= r; ++k ) {
         if ( L[i] <= R[j] ) {
              a[k] = L[i];
              i++;
         }
         else {
              a[k] = R[j];
              j++;
         }
     }
}

void MERGESORT ( int *a, int p, int r ) {
     if ( p < r ) {
          int q = ( r + p ) / 2;
          MERGESORT ( a, p, q );
          MERGESORT ( a, q + 1, r );
          MERGE ( a, p, q, r );
     }
}

int main ( ) {
    int n, a[10000];
    while ( scanf ( "%d", &n ) != EOF ) {
          for ( int i = 1; i <= n; ++i )
              scanf ( "%d", &a[i] );
          MERGESORT ( a, 1, n );
          for ( int i = 1; i <= n; ++i )
              printf ( "%d ", a[i] );
          printf ( "\n" );
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值