#include <bits/stdc++.h>
const int maxn = 100004;
void Merge(int data[], int pd[], int l, int mid, int r)
{
int i, j, k;
i = l; j = mid + 1; k = 0;
while(i <= mid && j <= r) // 合并
pd[k++] = data[i] < data[j] ? data[i++] : data[j++];
while(i <= mid) pd[k++] = data[i++]; // 如果左边剩下了直接放最后
while(j <= r) pd[k++] = data[j++]; // 如果右边剩下了直接放最后
for(k = 0, i = l; i <= r; i++, k++)
data[i] = pd[k]; // 将[l,r] 区间排好后放回原数组空间
}
void MergeSort(int data[], int pd[], int l, int r)
{
int mid;
if(l < r) {
mid = (l + r) >> 1; // 将区间划分为左右两部分
MergeSort(data, pd, l, mid); // 对左边部分进行归并排序
MergeSort(data, pd, mid+1, r); // 对右边部分进行归并排序
Merge(data, pd, l, mid, r); // 合并左右排序的结果
}
}
int a[maxn];
int tmp[maxn]; //辅助空间
int main(){
int n;
while (scanf("%d",&n)!=EOF){
for (int i = 0; i < n; ++i){
scanf("%d",&a[i]);
}
MergeSort( a, tmp, 0, n-1 );
for (int i = 0; i < n; ++i){
printf("%d\n",a[i]);
}
}
return 0;
}
个人模板 归并排序
最新推荐文章于 2018-08-10 13:36:14 发布