昨天我自己写了一个快速排序法(用递归),在对数组进行排序的时候,发现数组长度超出6046会造成堆栈溢出。在我一个朋友的机器上运行也是这样。但是当我今天再测试的时候,发现数组长度超出6043就溢出了,我并没有修改代码。我在群里发给另一个朋友测试,他的结果是数组长度在6046时溢出。我重启了计算机再次运行,还是当数组长度超出6043时溢出,这到底是怎么回事?我很迷惑。我知道溢出跟这个算法的设计有关系,但我现在想知道的是为什么不同机器上的运行结果不同。在同一台机器上,隔了一天时间,运行结果居然变了,这到底是为什么?代码绝对没有变化,这一点我敢肯定。
解决方案 »
- 关于java2word(jacob)的替换
- 新手请教
- JAVA问题请教。“不是抽象的,并且未覆盖 javax”
- 请帮我看一下:用java语言写的BUTTON事件处理,背景色总是红色,哪里有点点小问题呢~~~~~~
- String.split()方法又一问
- forte和jbuilder哪个更合适开发?jbuider的光标怎么回事?
- swing的jlist控件该怎么插入数据啊??帮帮我啊~~~~
- 哪里有java2的api文档下载呀?
- java执行顺序的控制问题!
- 有没有相关的代码生成器项目是关于解决代码重用的?
- 为什么我在cmd里运行javac welcome.java 没显示/这是你的第一个程序,欢迎你走入Java的大门
- 将GZIPOutputStream改为ZipOutputStream,请高手之招!在线,解决马上结帖
任何细小的bug都可以造成极度古怪的行为。
试图从一个错误的角度考虑正确的行为是不理智的。
private int[] source; public QuickSort(int[] source){
this.source = source;
} public void sort(){
recQuickSort(0,source.length-1);
} private void recQuickSort(int left, int right){
if (left >= right){
return;
} else {
int pivot = source[right];
int partition = partition(left, right, pivot);
recQuickSort(left, partition-1);
recQuickSort(partition+1, right);
}
} private int partition(int left, int right, int pivot){
int leftIdx = left - 1;
int rightIdx = right ;
while (true){
while (source[++leftIdx] < pivot);
while (rightIdx > 0 && source[--rightIdx] >= pivot);
if(leftIdx < rightIdx){
swap(leftIdx, rightIdx);
} else {
break;
}
}
swap(leftIdx, right);
return leftIdx;
} private void swap(int idx1, int idx2){
int temp = source[idx1];
source[idx1] = source[idx2];
source[idx2] = temp;
}
public static void main(String[] args){
int[] n = new int[6046];//本来是超过6046溢出,现在超出6043就溢出。
for (int i=0; i<n.length; i++){
n[i] = n.length-i;
}
QuickSort qs = new QuickSort(n);
qs.sort();
}
} 输出:
Exception in thread "main" java.lang.StackOverflowError
at QuickSort.recQuickSort(quicksort.java:17)
at QuickSort.recQuickSort(quicksort.java:18)
at QuickSort.recQuickSort(quicksort.java:19)