簡體   English   中英

如果數組長度為 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");
}
`

您的代碼問題與輸入大小沒有直接關系。 相反,以間接方式,您發現的負數反轉是 function merge的變量inversion溢出的結果。

考慮輸入大小N = 100000的情況。 如果這個數字數組按降序排序,那么該數組中的所有有序對都是反轉的。 換句話說,將有N * (N-1) / 2反轉被計算在內。 您可能已經注意到,該值略高於unsigned int類型的界限。 因此,當您嘗試在 int 類型的變量中計算該值時,會發生溢出,從而導致否定結果。

要解決此問題,您應該在函數mergeMsort變量inversion的類型從int更改為long long (您還應該更新函數mergeMsort的返回類型)當然,您也應該將main function 中的Msort調用的返回值分配給long long類型的變量。 換句話說,將變量no_Of_Inversions的類型也更改為 long long。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM