如果数组长度为 100000,则使用合并排序对反转进行计数会给出负数
counting inversions with merge sort gives a negative number if the array length is 100000
我仍然是编程的初学者,我正在参加在线课程(算法(
其中一个练习题是计算包含随机排序的 100000 个数字的文件中的反转次数。我已经在小数据集上尝试过这段代码,它工作正常,但是当传递实际数据集时,它会以负数给出反转计数。尝试了来自不同平台的各种解决方案,但仍然无法解决。
所以这是我的代码
#include "stdafx.h"
#include <iostream>;
#include <conio.h>:
#include <fstream>
using namespace std;
long merge(int a[], int start, int mid, int end)
int i = start;
int j = mid + 1;
int k = start;
int inversion=0;
int temp[100000];
while (i <= mid && j <= end)
{
if (a[i] < a[j])
{
temp[k++] = a[i++];
}
else
{
temp[k++] = a[j++];
inversion =inversion + (mid - i);
}
}
while (i <= mid)
{
temp[k++] = a[i++];
}
while (j <= end)
{
temp[k++] = a[j++];
}
for (int i = start; i <= end; i++)
{
a[i] = temp[i];
}
return inversion;
long Msort(int a[], int start,int end)
{
if (start >= end)
{
return 0;
}
int inversion = 0;
int mid = (start + end) / 2;
inversion += Msort(a, start, mid);
inversion += Msort(a, mid + 1, end);
inversion += merge(a, start, mid, end)
return inversion;
}
long ReadFromFile(char FileName[], int storage[],int n)
{
int b;
int count=0;
ifstream get(FileName);
if (!get)
{
cout << "no file found";
}
while (!get.eof())
{
get >> storage[count];
count++;
}
b = count;
return b;
}
int main()
{
int valuescount = 0;
int arr[100000];
char filename[] = { "file.txt" };
long n = sizeof(arr) / sizeof(arr[0]);
valuescount=ReadFromFile(filename, arr,n);
int no_Of_Inversions = Msort(arr, 0, valuescount -1);
cout << endl << "No of inversions are" << 't' << no_Of_Inversions <<'t';
cout <<endl<< "Total no of array values sorted"<< valuescount<<endl;
system("pause");
}
`
代码的问题与输入大小没有直接关系。相反,以间接的方式,您发现的负数反转是函数merge
的变量inversion
溢出的结果。
考虑输入大小的情况N = 100000
。如果此数字数组按降序排序,则该数组中的所有有序对都将是反转。换句话说,将有N * (N-1) / 2
反转需要计算。您可能已经注意到,该值略高于unsigned int
类型的边界。因此,当您尝试在 int 类型的变量中计算此值时,会发生溢出,从而导致负结果。
要解决此问题,您应该在函数merge
和Msort
中将变量inversion
的类型从int
更改为long long
。(您还应该更新函数的返回类型merge
和Msort
(当然,您还应该将main
函数中Msort
调用的返回值分配给long long
类型的变量。换句话说,将变量no_Of_Inversions
的类型也更改为长整型。
相关文章:
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 显示错误输出的简单数组排序程序
- 为什么我的排序算法会更改数组值
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 合并排序不排序自创建数组类 c++
- 带有枚举方向/类型的气泡排序结构数组
- 为什么指针在对二维数组进行排序时无法正常工作?
- 排序并行数组
- 如何在数组 c++ 中对字符串进行排序
- 为什么在此排序算法实现中,向量明显比数组慢?
- 如何对不在数组中的变量进行排序?
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 按字母顺序对结构内数组变量中的名称进行排序
- 使用排序函数 c++ 对字符数组进行排序
- 使用 std::sort 对二维 c 数组进行排序
- 使用STL对用户输入数组进行排序的错误有什么解决方案吗?
- 使用 std::sort 对 C 样式的 2D 数组进行部分排序
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- 对 0 、1 和 2 的数组进行排序