使用递归实现自顶向下的归并排序:
using namespace std;
//将arr[L...mid]和arr[mid+1...r]两部分进行归并
template<typename T>
void __merge(T arr[], int L, int mid, int r) {
T aux[r - L + 1];
for (int i = L; i <= r; i++)
aux[i - L] = arr[i];
int i = L, j = mid + 1;
for (int k = L; k <= r; k++) {
if (i > mid) {
arr[k] = aux[j - L];
j++;
}
else if (j > r) {
arr[k] = aux[i - L];
i++;
}
else if (aux[i - L] < aux[j - L]) {
arr[k] = aux[i - L];
i++;
}
else {
arr[k] = aux[j - L];
j++;
}
}
}
//递归使用归并排序,对arr[L...r]的范围进行排序
template<typename T>
void __mergeSort(T arr[], int L, int r) {
//if (L >= r)
// return;
if (r - L < 16) { //优化
insertionSort(arr, l, r);
return;
}
int mid = (L + r) / 2;
__mergeSort(arr, L, mid);
__mergeSort(arr, mid + 1, r);
if (arr[mid] > arr[mid + 1]) //优化
__merge(arr, L, mid, r);
}
template<typename T>
void mergeSort(T arr[], int n) {
__mergeSort(arr, 0, n - 1);
}
//对arr[L...r]范围的数组进行插入排序
template<typename T>
void insertionSort(T arr[], int L, int r) {
for (int i = L + 1; i <= r; i++) {
T e = arr[i];
int j;
for (j = i; j > L&&arr[j - 1] > e; j--)
arr[j] = arr[j - 1];
arr[j] = e;
}
return;
}
自底向上的归并排序:
#include <algorithm>
using namespace std;
//将arr[L...mid]和arr[mid+1...r]两部分进行归并
template<typename T>
void __merge(T arr[], int L, int mid, int r) {
T aux[r - L + 1];
for (int i = L; i <= r; i++)
aux[i - L] = arr[i];
int i = L, j = mid + 1;
for (int k = L; k <= r; k++) {
if (i > mid) {
arr[k] = aux[j - L];
j++;
}
else if (j > r) {
arr[k] = aux[i - L];
i++;
}
else if (aux[i - L] < aux[j - L]) {
arr[k] = aux[i - L];
i++;
}
else {
arr[k] = aux[j - L];
j++;
}
}
}
template<typename T>
void mergeSortBottomUp(T arr[], int n) {
for (int size = 1; size <= n; size += size)
for (int i = 0; i + size < n; i += size + size)
//对arr[i...i+size-1]和arr[i+size...i+2*size-1]进行归并
__merge(arr, i, i + size - 1.min(i + size + size - 1, n - 1));
}