#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;
}
Node:原地歸併
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.