数组反转
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)
我对您的代码进行了一些修改,现在可以使用了,我会给出一些提示:
更改合并排序的类型并合并为 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
。
我不太确定我是否应该提供所有代码
我正在尝试计算此数组中的反转次数,但我真的不确定从哪里开始计数。我尝试了很多不同的地方,我认为这是增加计数器的正确位置,但我错了,因为输出太远了。关于如何理解将增量放在哪里的任何提示?我想我只是因为递归部分而感到困惑。我无法理解它。啊。非常感谢。
#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)
我对您的代码进行了一些修改,现在可以使用了,我会给出一些提示: 更改合并排序的类型并合并为 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
。
我不太确定我是否应该提供所有代码