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