在我的排序程序的Java代码中(使用我的insertionsort算法实现对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
答案 0 :(得分:5)
最简单的方法是将计数器变为long
而不是int
。这将使您最多可以计算9,223,372,036,854,775,807。
如果每个exch()
需要一个CPU周期,那么在3GHz计算机上需要大约100年才能使long
计数器溢出。
答案 1 :(得分:4)
原始类型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
数据类型和(只是肯定)测试溢出计数器。
答案 2 :(得分:1)
每次增加它都可以检查它是否为负数,如果是,则设置溢出为1。您还可以使用另一个整数来跟踪此情况。也许之后将它设置为0。你有机会吗
exchcount++;
进入
exchcount++;
if (exchcount<0) {
overflowcount++;
exchcount=0;
}
您也可以使用long,这将允许您的程序使用64而不是32位。
这需要你机会
private static int exchcount=0;
进入
private static long exchcount=0;
这将允许您计入2 ^ 63而不是2 ^ 31
答案 3 :(得分:0)
使用long
代替int
。这是一个简单的答案。