题目
归并排序
C++ 代码
#include <iostream>
using namespace std;
const int N = 100010;
int q[N], tmp[N];
void merge_sort(int q[], int l, int r)
{
if(l >= r) return ; //到达边界时 退出递归
int mid = l + r >> 1; //mid将区间一分为二
merge_sort(q, l, mid), merge_sort(q, mid + 1, r); //递归求解 分解区间为最小的块儿 从小到大 当区间只有一个数的时候他就是有序的 再一个一个加进来还是有序的
int i = l, j = mid + 1, k = 0; //定义双指针 分别指向子区间的首元素
while(i <= mid && j <= r) //当子区间其中一个归并操作结束之后结束操作
{
if(q[i] <= q[j]) tmp[k ++] = q[i ++];
else tmp[k ++] = q[j ++];
}
while(i <= mid) tmp[k ++] = q[i ++]; //判断是那个子区间里面还有元素 将剩下的有序元素直接加入tmp数组后面
while(j <= r) tmp[k ++] = q[j ++];
for(int i = 0, j = l; j <= r; j ++, i ++) q[j] = tmp[i]; //将排好序的元素放回原数组
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i ++) cin >> q[i];
merge_sort(q, 0, n - 1);
for(int i = 0; i < n; i ++) cout << q[i] << " ";
return 0;
}