Node:普通歸併

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stack>
#include <queue>

#define flush(arr,i) memset(arr,i,sizeof(arr))
using namespace std;
const int maxn=1010;
int arr[maxn], tmp[maxn];
int n,m;


//向上歸併的實現
void mergeUp(int l, int m, int r)
{
    int i = l, j = m + 1, pos = l;
    //依次取數據到tmp中,左區間[l...m],右區間[m+1...r]
    while( i <= m && j <= r)
    {
        if(arr[i] < arr[j])
            tmp[pos++] = arr[i++];
        else
            tmp[pos++] = arr[j++];
    }
    //將剩下的有序序列添加到tmp之後
    while(i <= m)
        tmp[pos++] = arr[i++];
    while(j <= r)
        tmp[pos++] = arr[j++];
    //排序成功拷貝
    for(int k = l; k <= r; k++)
        arr[k] = tmp[k];

}

//向下劃分
void mergeSort(int l,int r)
{
    if(l < r)
    {
        int m = (l + r) / 2;
        mergeSort(l, m);
        mergeSort(m + 1, r);
        //向上歸併
        mergeUp(l, m, r);
    }
}

int main()
{
    freopen("data.txt","r",stdin);
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
        scanf("%d",arr + i);
    for(int i = 0; i < n; i++)
        printf("%d%c", arr[i], i == n-1 ? '\n' : ' ');
    mergeSort(0, n - 1);
    for(int i = 0; i < n; i++)
        printf("%d%c", arr[i], i == n-1 ? '\n' : ' ');
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章