归并排序的核心是二分
#include<iostream>
using namespace std;
void Merge(int arr[], int low, int mid, int high) {
int i = low, j = mid + 1, k = 0;
int* temp = new(nothrow) int[high - low + 1];
if (!temp) {
cout << "error" << endl;
return;
}
while (i <= mid && j <= high) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
}
else temp[k++] = arr[j++];
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= high) {
temp[k++] = arr[j++];
}
for (i = low, k = 0; i <= high; i++, k++) {
arr[i] = temp[k];
}
delete[] temp;
}
void MergeSort(int arr[], int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
MergeSort(arr, low, mid);
MergeSort(arr, mid + 1, high);
Merge(arr, low, mid, high);
}
else {
return;
}
}
void MergeSort1(int arr[], int n) {//n代表数组中元素个数,即数组最大下标是n-1{
/*
int step = 1;
while (step < n) //当元素个数不是2的幂时可能会出错,未考虑第2个序列个数不足的情况
{
for (int i = 0; i <= n - step - 1; i += 2 * step)
Merge(arr, i, i + step - 1, i + 2 * step - 1);
step *= 2;
}*/
int size = 1, low, mid, high;
while (size <= n - 1) {
low = 0;
while (low + size <= n - 1) {
mid = low + size - 1;
high = mid + size;
if (high > n - 1)//第二个序列个数不足size
high = n - 1;
Merge(arr, low, mid, high);//调用归并子函数
low = high + 1;//下一次归并时第一关序列的下界
}
size *= 2;//范围扩大一倍
}
}
int a[10000];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
MergeSort2(a, n - 1);
for (int i = 0; i < n; i++) {
cout << a[i];
cout << " ";
}
return 0;
}