簡體   English   中英

如果數組的長度為100000,則用歸並排序對反轉進行計數會得出負數

[英]counting inversions with merge sort gives a negative number if the array's length is 100000

我仍然是編程的初學者,並且正在參加在線課程(算法)

練習題之一是計算包含100000個隨機排序數字的文件中的反轉次數

所以這是我的代碼

    package algo_inversion;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;

public class Algo_inversion {
    public static int splitMerge(int[]A,int start,int mid,int finish){
        int count=0;
        int []L=new int[mid+2-start];
        int []R=new int[finish-mid+1];
        System.arraycopy(A, start, L, 0, L.length-1);
        L[L.length-1]=5000000;//infinity

        for(int i=0;i<R.length-1;i++){
            R[i]=A[mid+1+i];
        }
        R[R.length-1]=5000000;//infinity

        int x=0;
        int y=0;
        for(int k=start;k<finish+1;k++){
            if(L[x]<=R[y]){
                A[k]=L[x];
                x++;
            }
            else{
                A[k]=R[y];
                y++;
                count+=L.length-1-x;
            }
        }
        return count;        
    }
    public static int countMerge(int []A,int start, int finish){
        if(finish<=start){
            return 0;
        }
        else{
            int mid=(finish+start)/2;
                int leftCount=countMerge(A,start,mid);
                int rightCount=countMerge(A,mid+1,finish);
                int splitCount=splitMerge(A,start,mid,finish);
                return(leftCount+rightCount+splitCount);
        }
    }

    public static void main(String[] args) throws FileNotFoundException {
        int []a=new int[100001];
       Scanner in= new Scanner(new FileReader("IntegerArray.txt"));
       int i=0;
        while(in.hasNext()){
            a[i]=in.nextInt();
            i++;
        }
        in.close();
        System.out.println("inversions=: "+countMerge(a, 0, i-1));

    }
}

我試過了從1到200大小的隨機數組,它可以很好地工作,但是與文件中的數組相比,它給了我一個負數! 我只是不知道是什么原因造成的,不勝感激,我可以得到^ _ ^

反轉的在尺寸的陣列的最壞情況數目NN*(N-1)/2 適合int的最大值約為20億,因此大小大於65,000數組有可能溢出int ,從而使結果看起來是負數。

您應該切換到long以擴展計數器可代表的值范圍:

public static long splitMerge(int[]A,int start,int mid,int finish) {
    long count = 0;
    ...
}
public static long countMerge(int []A,int start, int finish) {
    ...
}

我試過了從1到200大小的隨機數組,它可以很好地工作,但是與文件中的數組相比,它給了我一個負數!

反轉次數似乎超過了Integer.MAX_VALUE的值,因此您會看到溢出為負數。 您應該使用long來計算反轉次數。

這是Joel Spolsky的《 JavaSchools的危險》的示例 通過使人們躲避機器中真正發生的事情,當他們遇到這樣的問題時,他們不知道發生了什么。 當您計數某物時,看到負面結果時,應該彈出的第一件事是溢出,超出了Integer.MAX_VALUE的范圍。

暫無
暫無

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

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