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];
int n;

//區間翻轉
void reverseArr(int l,int r)
{
    while(l < r)
        swap(arr[l++],arr[r--]);
}

//核心內存拷貝
void memSwap(int l,int m,int r)
{
    reverseArr(l, m - 1);
    reverseArr(m, r);
    reverseArr(l, r);
}

//向上歸併
void mergeUp(int l,int m,int r)
{
    int i = l,j = m + 1;
    while(i < j && j <= r)
    {
        while(arr[i] <= arr[j] && i < j)
            i++;
        int index = j;
        while(arr[j] < arr[i] && j <= r)
            j++;
        memSwap(i, index, j - 1);
        i+=j-index;
    }
}


void mergeSort(int l,int r)
{
    if(l < r)
    {
        int m = (r + l)/2;
        mergeSort(l, m);
        mergeSort(m + 1,r);
        mergeUp(l, m, r);
    }
}

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

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