#include <bits/stdc++.h>
using namespace std;
int a[1000];
int t[1000];
void merge_sort(int x, int y)
{
if (y - x > 1) //当if不成立时即是递归的出口
{
int mid = x + (y-x)/2;
int p = x, q = mid, len = x; //p指针从左往右遍历a[x,mid) q指针从左往右遍历a[mid,y) ,len记录辅助数组大小
merge_sort(x,mid); //将当前分成左边一部分,左边递归继续一分为二, 自己调用自己,此时就把merge_sort看成排序函数,将[x,mid)区间排好了序
merge_sort(mid,y); //将当前分成右边一部分, 右边递归继续一分为二
while(p < mid && q < y) //因为是开区间,不是闭区间,只要其中一个数组遍历完到辅助数组t中就退出循环
{
if (a[p] < a[q]) t[len++] = a[p++]; //将较小数组的元素放入t中
else t[len++] = a[q++];
}
while(p < mid) t[len++] = a[p++]; //两个while循环找出谁遍历完了,没遍历完的数组所剩下的元素存入辅助数组中
while(q < y) t[len++] = a[q++];
for (int i = x; i < len; i++) a[i] = t[i]; //将辅助数组存入a中,因为[len,y)的元素通过前面的递归和循环会从小到大的
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
merge_sort(0,n);
for (int i = 0; i < n; i++)
{
if (i == 0) cout << a[i];
else cout << " " << a[i];
}
return 0;
}
带分治思想的归并排序
最新推荐文章于 2023-10-18 14:10:54 发布