给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序。
即:数组a[]; 对于i < j 且 a[i] > a[j],则称这是一个反序。
即:数组a[]; 对于i < j 且 a[i] > a[j],则称这是一个反序。
给定一个数组,要求写一个函数,计算出这个数组里所有反序的个数。
#include <iostream>
using namespace std;
#define N 5
int merge(int* arr, int low, int mid, int high) {
int count = 0;
int firstLen = mid - low + 1;
int secondLen = high - mid;
int* tmp1 = new int[firstLen];
int* tmp2 = new int[secondLen];
for (int i = 0; i < firstLen; ++i) {
tmp1[i] = arr[low + i];
}
for (int i = 0; i < secondLen; ++i) {
tmp2[i] = arr[mid + 1 + i];
}
int k = low;
int i = 0, j = 0;
for (; i < firstLen & j < secondLen;) {
if (tmp1[i] <= tmp2[j]) {
arr[k++] = tmp1[i++];
} else { //逆序对情况
/*由于前半部分升序,若tmp1[i]与tmp2[j]为逆序对,
* 则前半部分从i开始(包含tmp1[i])的后续元素
* 与tmp2[j]也为逆序对: firstLen - i*/
arr[k++] = tmp2[j++];
count += firstLen - i;
}
}
//将剩余元素放入
while (i < firstLen) {
arr[k++] = tmp1[i++];
}
while (j < secondLen) {
arr[k++] = tmp2[j++];
}
return count;
}
int mergeSort(int* arr, int low, int high) {
int count = 0;
if (low < high) {
int mid = (low + high) / 2;
count += mergeSort(arr, low, mid);
count += mergeSort(arr, mid + 1, high);
count += merge(arr, low, mid, high);
}
return count;
}