排序算法——归并排序

165 阅读1分钟

归并排序是基于分治思想的一种算法,本质在于把数列均分,递归再归并为一个有序数列。

步骤

  1. 定义下标中点 mid = (l + r)/2,得到 (l , mid) (mid + 1, r) 两个数列
  2. 递归调用函数,对两个数列分别排序
  3. 把排序完成的两个数列进行比较,较小值顺序放进新的数组中

题目练习

给你一个长度为 n 的整数列表。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按照顺序输出。

输入格式

输入共两行,第一行包括整数n。 第二行包括 n 个整数,表示整个数列。

输入格式

输出共一行,包括 n 个整数,表示排好序的数列。

数据范围

1 <= n <= 1000000

输入样例

5
3 4 2 1 4

输出样例

1 2 3 4 4

C++ 代码实现

#include <iostream>

using namespace std;

const int N = 1e6 + 10;

int n;
int q[N],tmp[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);
  for (int i = 0; i < n; i ++ ) scanf("%d",&q[i]);

  merge_sort(q, 0, n - 1);

  for (int i= 0; i < n; i ++ ) printf("%d ",q[i]);
  return 0;
}