在我的排序程序Java代码(使用我的insertssort算法的实现对100000个整数进行排序)中,我试图找出数组中元素被交换了多少次。我将其设置为静态变量,因为sort()方法是静态的。

但是,有时在程序运行期间,我认为已超过整数限制,最终计数显示为负数。必须有一种方法可以对此进行更正并获得数值上正确的计数,但是我无法弄清楚这一点。

public class InsertionSort {
    private static int exchcount=0;

    public static void exch(Comparable[] a, int i,int j){
        Comparable temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    public static int exchangeCount(){
        return exchcount;
    }

    public static void sort(Comparable[] a){
    int N = a.length;

    for(int i=0; i< N;i++){
        for(int j=i; j>0 && less(a[j],a[j-1]); j--){
        exch(a,j,j-1);
        exchcount++;

        }
       }
   }
...

    public static void main(String[] args) {
        Integer[] a = RandomNumberArrayGenerator.generate(100000);
        sort(a);
        System.out.println("number of exchanges="+ exchangeCount());
   }

这给
number of exchanges= -1799089211

最佳答案

原始类型int是带符号的,32位值从-2,147,483,648到2,147,483,647(含)。参见java tutorial

如果结束后的值是-1799089211,则意味着当exchanges达到2,147,483,647时,它变为-2,147,483,648,而不是-2,147,483,647等,依此类推...因此,您的(-2,147,483,648 + 1799089211 - 1)超出了原始类型int的限制。当然,这种情况假设您的计数器仅溢出了一次,但是它应该溢出了不止一次。

使用long数据类型和(请确保)测试计数器的溢出。

10-07 18:31