数组中的反转

时间:2015-01-27 23:12:35

标签: c++ mergesort

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

#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;
}

1 个答案:

答案 0 :(得分:2)

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

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

我对您的代码进行了一些更改,现在它可以正常工作,我会给出一些提示: 更改mergesort的类型并合并为long(或int)

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;

我还将mergesort更改为此。你的合并大多没问题,但你不应该将数量增加一个,而是增加数量mid-h+1。 我不太确定我应该提供所有代码