[英]Inversions in Array
我試圖計算該數組中的反轉次數,但我真的不確定從哪里開始計算。 我嘗試了很多不同的位置,我認為這是增加計數器的正確位置,但是我誤會了,因為輸出很遠。 關於如何理解增量的任何提示? 我認為我只是因為遞歸部分而感到困惑。 我不能把頭纏住它。 啊。 非常感謝。
#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)的后半部分的反轉數和一個元素在上半部分中的另一個元素在第二個元素中的反轉數( Z),因此total number of inversions = X+Y+Z
,其中X是上半部分的合並排序的結果,下半部分的Y合並排序的結果,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更改為此。 您的合並基本上可以,但是您不應該將count增加一個,而應該將其添加mid-h+1
。 我不太確定我應該提供所有代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.