マージソートを使用して反転カウントコードを記述しますが、入力が大きいconstであるため
int配列、どうすれば高速化できますか?(o(nlogn)の係数を小さくしますか?)
それを行うためのコードのヒントはありますか?
事前にThx。
#include<iostream>
using namespace std;
int invCount(int*, int);
int merge(int*, int*, int, int*, int);
int NumberOfInversion(const int*, int);
int main(void){
const int array[] = {0, 1, 4, 3, 2};
cout << NumberOfInversion(array, 5) << "times" << endl;
return 0;
}
int invCount(int *array, int length){
if(length <= 1)return 0;
int middle = (length + 1) / 2;
int left[middle];
int right[length - middle];
for(int i = 0; i < middle; i ++)left[i] = array[i];
for(int i = middle; i < length; i ++)right[i - middle] = array[i];
return invCount(left, middle) + invCount(right, length - middle
) + merge(array, left, middle, right, length - middle);
}
int merge(int* array, int* left, int leftLength, int* right, int rightLength){
int i = 0, j = 0, count = 0;
while(i < leftLength && j < rightLength){
if (left[i] <= right[j]){
array[i + j] = left[i];
i ++;
}
else {
array[i + j] = right[j];
j ++;
count += leftLength - i;
}
}
if(i == leftLength){
while(j < rightLength){
array[i + j] = right[j];
j ++;
}
}
else{
while(i < leftLength){
array[i + j] = left[i];
i ++;
}
}
return count;
}
int NumberOfInversion(const int *A, int N)
{
int input[N];
for(int i = 0; i < N; i ++)input[i] = A[i];
int result = invCount(input, N);
return result;
}
ps:すべての可能なペアの約20%が反転されます