hi,主要注意两点:
1、如果只用一份传入的临时数组,在merge的最后,要把所有元素,copy回原数组;
2、逆序数计算的时候 low2-i,而不是 low2-low1
其实还可以做一点优化,就是在merge函数里,后半段如果没结束,可以不用copy到临时数组,
然后从临时数组,copy回原数组的时候,可以少copy一段。
#include <iostream>
using namespace std;
int reverse_num = 0;
template<class T>
void print(T a[], int n) {
for (int i=0; i<n; i++) {
cout << a[i] << " ";
}
cout << endl;
}
void merge (int a[], int start, int mid, int end, int c[]) {
int low1 = start;
int low2 = mid+1;
int i = start;
while (low1 <= mid && low2 <= end) {
if (a[low1] > a[low2]) {
c[i] = a[low2];
reverse_num += (low2-i);
low2++;
} else {
c[i] = a[low1];
low1++;
}
i++;
}
for (;low1 <= mid; low1++) {
c[i] = a[low1];
i++;
}
for (;low2 <= end; low2++) {
c[i] = a[low2];
i++;
}
for (int i=start; i<=end; i++) {
a[i] = c[i];
}
}
void merge_sort (int a[], int start, int end, int c[]) {
if (start >= end) {
return;
}
int mid = (start + end)/2;
merge_sort(a, start, mid, c);
merge_sort(a, mid+1, end, c);
merge(a, start, mid, end, c);
}
int main () {
int a[] = {3,4,1,20,18,31,6,13};
int size = sizeof(a)/sizeof(int);
cout << size << endl;
int c[size];
print(a, size);
merge_sort(a, 0, size-1, c);
print(a, size);
cout << "reverse_num:" << reverse_num << endl;
}
转载于:https://blog.51cto.com/tianyanshentong/1559580