- 给出一个数组 arr[8] = {8,7,4,5,4,10,2,1},比如8,7就是逆序,使用归并排序找出逆序对的个数,代码如下:
#include <iostream>
int nixu = 0;
using namespace std;
template <typename T>
void __merge(T arr[], int l, int mid, int r) {
T aux[r-l+1];
for (int i = l; i <= r; ++i) {
aux[i-l] = arr[i];
}
int i = l, j = mid + 1;
for (int k = l; k <= r; ++k) {
if(i > mid) {
arr[k] = aux[j-l];
j++;
}
else if (j > r) {
arr[k] = aux[i-l];
i++;
}
else if (aux[i-l] <= aux[j-l]) {
arr[k] = aux[i-l];
i++;
}
else {
nixu += mid - i + 1;
arr[k] = aux[j-l];
j++;
}
}
}
template <typename T>
void mergeSortBU(T arr[], int n) {
for (int sz = 1; sz <= n; sz += sz) {
for (int i = 0; i < n - sz; i += sz + sz) {
__merge(arr, i, i+sz-1, min(i+sz+sz-1, n-1) );
}
}
}
int main() {
int arr[8] = {8,7,4,5,4,10,2,1};
mergeSortBU(arr, 8);
cout << "nixu: " << nixu;
return 0;
}
output:
nixu: 21
Process finished with exit code 0
- 一个完整的自底向上的归并排序只需要修改两个地方就实现了上述的计算数组中逆序对个数的算法。