求逆序对的个数
特点:利用归并排序中合并的步骤,计算逆序对
时间复杂度O(nlgn)
int merge_inversion(int *arr,int start,int end,int middle);
int count_inversion(int *arr,int start,int end)
{
if(start<end)
{
int middle = (start + end)/2;
int left = count_inversion(arr,start,middle);
int right = count_inversion(arr,middle+1,end);
return left + right + merge_inversion(arr,start,end,middle);
}
else
return 0;
}
int merge_inversion(int *arr,int start,int end,int middle)
{
int *left_arr = new int [middle - start + 2];
int *right_arr = new int [end - middle + 3];
for (int i = start; i < middle+1; ++i) {
left_arr[i-start] = arr[i];
}
for (int i = middle+1; i < end+1; ++i) {
right_arr[i-middle-1] = arr[i];
}
left_arr[middle -start + 1] = INT_MAX;
right_arr[end - middle] = INT_MAX;
int left = 0,right = 0,inversions = 0;
int left_count = middle - start + 1;
for (int i = start; i < end+1; ++i) {
if(left_arr[left]<=right_arr[right])
{
arr[i] = left_arr[left];
left++;
}
else
{
arr[i] = right_arr[right];
right++;
inversions += left_count - left;
}
}
delete [] left_arr;
delete [] right_arr;
return inversions;
}