昨天我自己写了一个快速排序法(用递归),在对数组进行排序的时候,发现数组长度超出6046会造成堆栈溢出。在我一个朋友的机器上运行也是这样。但是当我今天再测试的时候,发现数组长度超出6043就溢出了,我并没有修改代码。我在群里发给另一个朋友测试,他的结果是数组长度在6046时溢出。我重启了计算机再次运行,还是当数组长度超出6043时溢出,这到底是怎么回事?我很迷惑。我知道溢出跟这个算法的设计有关系,但我现在想知道的是为什么不同机器上的运行结果不同。在同一台机器上,隔了一天时间,运行结果居然变了,这到底是为什么?代码绝对没有变化,这一点我敢肯定。
解决方案 »
- 求大神帮忙啊,一个java求和问题
- 问一个有序集合的问题
- 组合,我觉得做为一个专有名词,不恰当。讨论下
- 高手指教,谢谢了!
- 关于JNI在web上应用的问题???
- 菜鸟入门 请教:入键盘接收字符串
- 请教各位大侠!!!!!!
- 求救:如何将通过socket将 一个String和<CRLF>.<CRLF> 一起传给服务器端
- 你们用的SL275教程到底是什么样的?
- classpath指定.zip文件无效,怎么办
- 为什么我在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)