数组中的反转

Inversions in Array

本文关键字:数组      更新时间:2023-10-16

我正在尝试计算此数组中的反转次数,但我真的不确定从哪里开始计数。我尝试了许多不同的位置,我认为这将是增加计数器的正确位置,但我错了,因为输出很远。关于如何理解将增量放在哪里的任何提示?我想我只是因为递归部分而感到困惑。我无法绕开它。呸。提前非常感谢。

#include <iostream>
using namespace std;
int count = 0;
void merge(int[], int, int, int);
void mergesort(int array[], int low, int high)
{
int mid;
if(low < high)
{
   mid = low + (high-low)/2;
   mergesort(array, low, mid);
   mergesort(array, mid+1, high);
   merge(array, low, mid, high);
}
}
void merge(int array[], int low, int mid, int high)
{
   int h, i, j, b[high + 1], k;
   h = low;
   i = low;
   j = mid + 1;
while((h <= mid) && (j <= high))
{
   if(array[h] <= array[j])
   {
      b[i] = array[h];
      h++;

   }
   else
   {
      b[i] = array[j];
      j++;
      count++;
   }
   i++;
}
if( h > mid)
{   
   for(k = j; k <= high; k++)
   {
      b[i] = array[k];
      i++;    
   }
}
   else
   {
      for(k = h; k <= mid; k++)
      {
         b[i] = array[k];
         i++;
      }

   }
  for( k = low; k <= high; k++)
   {
     array[k] = b[k];
   }  
}
int main()
{
   int size;
   cin >> size;
   int data[size];
   for(int i = 0; i < size; i++)
   {
      cin >> data[i] ;
   }
mergesort(data, 0, size-1);
   for(int i = 0; i < size; i++)
   {
       cout << data[i];
   }
   cout << endl << count;
}
数组

a 中的反转次数是多少?它等于数组 a(X) 前半部分的反转数加上数组 a (Y) 后半部分的反转数,以及一个元素在前半部分而另一个元素在后半部分的反转数所以total number of inversions = X+Y+Z 其中 X 将是前半部分合并排序的结果,Y 合并排序为后半部分的结果,Z 将是合并的结果。

X = mergesort(firstHalf of a)
Y = mergesort(secondHalf of a)
Z = merge(firstHalf,secondHalf) 

我对您的代码进行了一些更改,现在它可以工作了,我将提供一些提示:更改合并排序的类型并合并为长整型(或整型)

if(low < high)
{
    mid = low + (high-low)/2;
    long x =mergesort(array, low, mid);
    long y =mergesort(array, mid+1, high);
    long z =merge(array, low, mid, high);
    return x+y+z;
}
else
    return 0;

我也把合并排序改成了这个。您的合并基本上没问题,但您不应该将计数增加一个,而应该增加数字mid-h+1。我不太确定我是否应该提供所有代码