二路归并排序算法模板
感谢大佬yxc普及算法思想的精髓。
题目描述
给定你一个长度为n的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
时间复杂度 O(n * logn)
参考文献 【数据结构(C++版)邓俊辉 第三版】
C++ 代码
#include <iostream>
using namespace std;
// 所有区间都是下闭上开区间
void merge ( int* arr, int lo, int mi, int hi ) {
// 将arr数组看做两段 数组A和数组C
// 复制划分得到的左边数组A到新的数组B中
// 将数组B和C中的数据归并到原数组A中
int* A = arr + lo;
int lb = mi - lo;
int* B = new int[lb];
for ( int b = 0; b < lb; ++b ) B[ b ] = A[ b ];
// 按大小顺序将B数组和C数组的元素放置到A数组中
int lc = hi - mi;
int* C = arr + mi;
int i = 0, j = 0, k = 0;
while ( i < lb && j < lc ) {
if ( B[i] <= C[j] ) A[k++] = B[i++];
else A[k++] = C[j++];
}
while ( i < lb ) A[k++] = B[i++];
while ( j < lc ) A[k++] = C[j++];
delete [] B; //释放临时空间B
} //归并后得到完整的有序数组[lo, hi)
void merge_sort ( int* arr, int lo, int hi ) { // 0 <= lo < hi <= n
if(hi - lo < 2) return; //单个元素区间自然有序
int mi = lo + ( ( hi - lo ) >> 1 ); // 以中点为界
merge_sort ( arr, lo, mi );
merge_sort ( arr, mi, hi ); // 分别排序
merge ( arr, lo, mi, hi ); // 归并
}
int main ( ) {
int n;
cin >> n;
int arr[ n ];
for ( int i = 0; i < n; ++i ) cin >> arr[ i ];
merge_sort ( arr, 0, n );
for ( int i = 0; i < n; ++i ) cout << arr[ i ] << " ";
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010;
int n, a[N];
// 所有区间都是下闭上开区间
void merge(int l, int m, int r) {
// 将a数组看做两段 数组A和数组C
// 复制划分得到的左边数组A到新的数组B中
// 将数组B和C中的数据归并到原数组A中
int* A = a + l;
int* B = new int[m - l];
memcpy(B, A, (m - l) * sizeof(int));
// 按大小顺序将B数组和C数组的元素放置到A数组中
int* C = a + m;
int i = 0, j = 0, k = 0;
while (i < m - l && j < r - m) {
if (B[i] <= C[j]) A[k++] = B[i++];
else A[k++] = C[j++];
}
while (i < m - l) A[k++] = B[i++];
while (j < r - m) A[k++] = C[j++];
delete []B; //释放临时空间B
} //归并后得到完整的有序数组[l, r)
void sort(int l, int r) { // 0 <= l < r <= n
if(r - l <= 1) return; //单个元素区间自然有序
int m = l + ((r - l) >> 1); // 以中点为界
sort(l, m);
sort(m, r); // 分别排序
merge(l, m, r); // 归并
}
int main(void) {
cin >> n;
for (int i = 0; i < n; ++i) cin >> a[i];
sort(0, n);
for (int i = 0; i < n; ++i) cout << a[i] << " ";
return 0;
}