将长度为n的子序列递归拆解成n/2个子序列,进行两两排序,递归左序列,递归右序列,知到得到n个长度为1的自然有序序列。
#include<iostream>
using namespace std;
void merge(int a[], int left, int mid, int right) {
int n = right - left + 1;
int* p = new int[n];
int i = left; int m = mid; int w = mid + 1; int j = right;
int k = 0;
while ((i <= m) && (w <= j)) {
if (a[i] < a[w]) {
p[k] = a[i];
i++;
}
else {
p[k] = a[w];
w++;
}
k++;
}
while (i <= m) {
p[k] = a[i];
i++;
k++;
}
while (w <= j) {
p[k] = a[w];
w++;
k++;
}
int t = left;
for (int temp = 0;((temp<k) &&(t<=right)); temp++) {
a[t] = p[temp];
t++;
}
delete[]p;
p = NULL;
}
void merge_sort(int a[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
merge_sort(a, left, mid);
merge_sort(a, mid + 1, right);
merge(a, left, mid, right);
}
}
int main() {
int a[] = { 1,4,2,8,6,9,3,7,0,5 };
int n = sizeof(a) / sizeof(0);
for (int i = 0; i < n; i++) {
cout << a[i] << ' ';
}
cout << endl;
merge_sort(a, 0, n - 1);
for (int i = 0; i < n; i++) {
cout << a[i] << ' ';
}
return 0;
}