787. 归并排序

题目描述

给定你一个长度为n的整数数列。

请你使用归并排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。

输出格式

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

数据范围

1≤n≤100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

算法描述

归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法采用分治法.

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并操作的工作原理如下:

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

(以上算法描述来自百度百科)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 using namespace std;
 5 const int max_n=1e5+5;
 6 
 7 int a[max_n], b[max_n];
 8 
 9 void mergeSort(int l, int r) {
10     if(l>=r) return;
11     int mid=l+r >> 1;
12     mergeSort(l, mid);
13     mergeSort(mid+1, r);
14     int p1=l, p2=mid+1, cnt=l;
15     while(p1<=mid && p2<=r) {
16         if(a[p1]<=a[p2]) b[cnt++]=a[p1++];
17         else b[cnt++]=a[p2++];
18     }
19     while(p1<=mid) b[cnt++]=a[p1++];
20     while(p2<=r) b[cnt++]=a[p2++];
21     for(int i=l; i<=r; i++) 
22         a[i]=b[i];
23 }
24 
25 int main() {
26     int n;
27     cin>>n;
28     for(int i=0; i<n; i++) cin>>a[i];
29     mergeSort(0, n-1);
30     for(int i=0; i<n; i++) cout<<a[i]<<' ';
31     return 0;
32 }
原文地址:https://www.cnblogs.com/wwqzbl/p/13678554.html