在我的排序程序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
数据类型和(请确保)测试计数器的溢出。