觀察「分割陣列」與「合併有序子陣列」的流程,理解分治法如何提升效率。
原陣列 a[]
暫存陣列 reg[](目前合併結果)
合併排序使用分治法:先把陣列切小,再把排序好的子陣列合併回去。
#include <iostream>
using namespace std;
void merge_sort_recursive(int a[], int reg[], int start, int end) {
if (start >= end) return;
int mid = (start + end) / 2;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort_recursive(a, reg, start1, end1);
merge_sort_recursive(a, reg, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2) {
reg[k++] = (a[start1] <= a[start2]) ? a[start1++] : a[start2++];
}
while (start1 <= end1) reg[k++] = a[start1++];
while (start2 <= end2) reg[k++] = a[start2++];
// 把暫存區 reg 的結果寫回原陣列 a
for (int i = start; i <= end; i++) {
a[i] = reg[i];
}
}
int main() {
int data[] = {7, 2, 9, 1, 5, 3};
int reg[6] = {0};
int n = 6;
merge_sort_recursive(data, reg, 0, n - 1);
cout << "排序結果: ";
for (int i = 0; i < n; i++) {
cout << data[i] << " ";
}
cout << endl;
return 0;
}