归并排序
递归版
#include <iostream>
using namespace std;
// reg 是临时存储归并结果的数组
void merge(int* arr, int* reg, int start, int end) {
if (start >= end)
return;
int left = start;
int right = end;
int mid = (left + right) / 2;
merge(arr, reg, left, mid);
merge(arr, reg, mid + 1, right);
int start1 = left;
int start2 = mid + 1;
int resIdx = left;
while (start1 <= mid && start2 <= right) {
reg[resIdx++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
}
while (start1 <= mid) {
reg[resIdx++] = arr[start1++];
}
while (start2 <= right) {
reg[resIdx++] = arr[start2++];
}
// 将reg中的归并结果回填到arr中
for (resIdx = start; resIdx <= end; resIdx++) {
arr[resIdx] = reg[resIdx];
}
}
void mergeSort(int* arr, int* reg, const int size) {
merge(arr, reg, 0, size - 1);
}
int main() {
int size, i;
cin >> size;
int *arr = new int[size];
for (i = 0; i < size; i++) {
cin >> arr[i];
}
int *reg = new int[size];
mergeSort(arr, reg, size);
cout << endl;
cout << "Result:" << endl;
for (i = 0; i < size; i++) {
cout << arr[i] << " ";
}
cout << endl;
delete [] arr;
delete [] reg;
return 0;
}
迭代版
#include <iostream>
using namespace std;
void mergeSort(int arr[], int len) {
int *a = arr;
int *b = new int[len];
int seg, start;
for (seg = 1; seg < len; seg++) { //每轮增大归并段长度
for (start = 0; start < len; start += seg + seg) { // 每轮按照固定归并段长度归并所有数据
int mid = min(start + seg, len), end = min(start + seg + seg, len);
int start1 = start, end1 = mid, start2 = mid, end2 = end;
int k = start;
while (start1 < end1 && start2 < end2) {
b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
}
while (start1 < end1) {
b[k++] = a[start1++];
}
while (start2 < end2) {
b[k++] = a[start2++];
}
}
swap(a, b); // 每次进行归并的时候,b代表新数据,a代表旧数据,所以要进行交换
}
if (a != arr) { // a在每次循环结束之后都是代表最新数据,所以要保证最新数据回填
for (int i = 0; i < len; i++)
b[i] = a[i];
b = a;
}
delete [] b;
}
int main() {
int size;
cin >> size;
if (size <= 0)
return -1;
int *arr = new int[size];
int i;
for (i = 0; i < size; i++) {
cin >> arr[i];
}
mergeSort(arr, size);
for (i = 0; i < size; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}