首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果数组长度为100000,则使用合并排序对倒数进行计数会得到一个负数

如果数组长度为100000,则使用合并排序对倒数进行计数会得到一个负数
EN

Stack Overflow用户
提问于 2019-09-26 13:42:58
回答 1查看 148关注 0票数 0

我仍然是编程的初学者,我正在学习一门在线课程(算法)。

其中一个练习问题是计算包含100000个随机排序的数字的文件中的倒数。我已经在小数据集上尝试了这个代码,它工作得很好,但是当通过实际的数据集时,它给出的反转计数为负数。尝试了来自不同平台的各种解决方案,但仍然无法解决它。

这是我的代码

代码语言:javascript
复制
#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");
}
`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-26 16:25:24

代码的问题与输入大小没有直接关系。相反,以一种间接的方式,您发现的负数的反转是函数merge的变量inversion中溢出的结果。

考虑输入大小为N = 100000的情况。如果这个数字数组按降序排序,那么该数组中的所有有序对都将是倒数。换句话说,将有N * (N-1) / 2反转需要计数。正如您可能已经注意到的,该值略高于unsigned int类型的界限。因此,当您尝试在int类型的变量中计算此值时,会发生溢出,从而导致负结果。

要解决此问题,应在函数mergeMsort中将变量inversion的类型从int更改为long long。(您还应该更新函数mergeMsort的返回类型)自然地,您也应该将main函数中Msort调用的返回值分配给long long类型的变量。换句话说,将变量no_Of_Inversions的类型也更改为long long。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58110255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档