4.归并排序

 

复制代码
#include <iostream>
#include <cstdio>
using namespace std;

const int Maxm = 1000 + 2;
const int Maxn = 0xfffffff;
int n[Maxm];

int merge (int s , int r, int t)
{
    if(s == t) return 0;
    merge(s, (s + r) / 2, r);
    merge(r + 1, (r + t + 1) / 2, t);
    
    int a[Maxm], b[Maxm];
    for(int i = s; i <= r; i++)
        a[i] = n[i];
    for(int i = r + 1; i <= t; i++)
        b[i] = n[i];
    a[r + 1] = b[t + 1] = Maxn;
    int j = s, k = r + 1;
    
    for(int i = 1;  i <= t - s + 1;  i++)
        if(a[j] <= b[k]) n[s + i - 1] = a[j++];
        else n[s + i - 1] = b[k++];
    
    return 0;
}

int main()
{
    int s = 1, t;
    scanf("%d", &t);
    for(int i = 1; i  <= t; i++)
        scanf("%d", &n[i]);
        
    merge(s, (s+ t) / 2,  t);
    
    for(int i = 1; i <= t; i++)
        printf("%d ", n[i]);
    printf("\n");
    return 0;
} //分治思想, 时间复杂度O(nlogn)
复制代码

递归的初级应用,可类比到线段树的建树过程,一个比较简略版本的代码不知被我扔哪去了,见到后再补充(((φ(◎ロ◎;)φ)))

posted @ 2016-09-08 10:42  筱陌  阅读(79)  评论(1编辑  收藏  举报