#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:普通归并
最新推荐文章于 2021-04-04 17:32:27 发布