数组中的反转
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
。我不太确定我是否应该提供所有代码
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '