《归并排序》

46 阅读1分钟
#include <iostream>
using namespace std;
const int N = 1e6 + 10; //防止数组越界。 
int q[N], tmp[N];
int n;
void merge_sort(int q[], int l, int r) 
{
   if (l >= r) return; //判断左边界是否大于等于右边界。 
   int mid = l + r >> 1; // 二分判断范围。 
   merge_sort(q, l, mid), merge_sort(q, mid + 1, r); //分支,对左右两个部分进行归并排序。 
   int k = 0, i = l, j = mid + 1; //定义两个指针,遍历整个数组,将数组分成两个部分。 
   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 ++];
   while (j <= r) tmp[k ++] = q[j ++];
   for (i = l, j = 0; i <= r; i ++, j ++) 
   q[i] = tmp[j]; //如果这两部分的元素其中有一部分已经被全部放进临时数组了,将另外一部分剩下的元素全部放进临时数组中,最后将临时数组的值赋给原数组。
 } 
   int main() 
{ 
   scanf("%d", &n); //读入元素个数n。 
   for (int i = 0; i < n; i ++) 
   scanf("%d", &q); //读入n个元素。 
   merge_sort(q, 0, n - 1); //使用归并排序对数组进行排序。 
   for (int i = 0; i < n; i ++)
   printf("%d ", q); //输出排序好的每个元素。 
   return 0;
}