昨天我自己写了一个快速排序法(用递归),在对数组进行排序的时候,发现数组长度超出6046会造成堆栈溢出。在我一个朋友的机器上运行也是这样。但是当我今天再测试的时候,发现数组长度超出6043就溢出了,我并没有修改代码。我在群里发给另一个朋友测试,他的结果是数组长度在6046时溢出。我重启了计算机再次运行,还是当数组长度超出6043时溢出,这到底是怎么回事?我很迷惑。我知道溢出跟这个算法的设计有关系,但我现在想知道的是为什么不同机器上的运行结果不同。在同一台机器上,隔了一天时间,运行结果居然变了,这到底是为什么?代码绝对没有变化,这一点我敢肯定。

解决方案 »

  1.   

    失败的算法怎样的失败行为都是正常的。
    任何细小的bug都可以造成极度古怪的行为。
    试图从一个错误的角度考虑正确的行为是不理智的。
      

  2.   

    其实我想知道的是造成STACK OVER FLOW的原因。
      

  3.   

    代码:class QuickSort{
        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)