【问题标题】:QuickSort giving exception in thread "main" java.lang.StackOverflowErrorQuickSort 在线程“主”java.lang.StackOverflowError 中给出异常
【发布时间】:2016-10-28 04:53:37
【问题描述】:

我已经编写了如下的快速排序代码。排序以中间数为轴:

import java.util.Arrays;

public class QuickSort {

    public static void main(String[] args) {

        int[] numbers = {3, 6, 9, 1, 34};

        int low = 0;

        int high = numbers.length - 1;

        quicksort(numbers, low, high);  

    }

    static void quicksort(int[] arr, int low, int high) {

        int i = low;
        int j = high;

        int middle = arr[(low + high) / 2];

        while(i < j) {      
            while(arr[i] < middle ) {
                i++;
            }

            while(arr[j] > middle) {
                j--;
            }

            if( i <= j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }


        }

        if(low < j) {
            quicksort(arr, low, j);         
        }

        if(i < high) {
            quicksort(arr, i, high);
        }

        System.out.println(Arrays.toString(arr));

    }

}

但是,在运行代码后,我得到了 stackoverflow 异常。 它说线程“主”java.lang.StackOverflowError中的异常

Exception in thread "main" java.lang.StackOverflowError
    at QuickSort.quicksort(QuickSort.java:47)
    at QuickSort.quicksort(QuickSort.java:47)
    at QuickSort.quicksort(QuickSort.java:47)
    at QuickSort.quicksort(QuickSort.java:47)
    at QuickSort.quicksort(QuickSort.java:47)
    at QuickSort.quicksort(QuickSort.java:47)
    at QuickSort.quicksort(QuickSort.java:47)

请帮助我找出运行上述代码时可能出现的问题。

【问题讨论】:

标签: java arrays algorithm sorting quicksort


【解决方案1】:

i和j的值需要分别递增和递减。请看下面的工作代码:

import java.util.Arrays;

public class QuickSort {

    public static void main(String[] args) {

        int[] numbers = {3, 9, 6, 1, 34};

        int low = 0;

        int high = numbers.length - 1;

        quicksort(numbers, low, high);  

    }

    static void quicksort(int[] arr, int low, int high) {

        int i = low;
        int j = high;

        int middle = arr[(low + high) / 2];

        while(i <= j) {      
            while(arr[i] < middle ) {
                i++;
            }

            while(arr[j] > middle) {
                j--;
            }

            if( i <= j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;

                i++;
                j--;
            }


        }

        if(low < j) {
            quicksort(arr, low, j);         
        }

        if(i < high) {
            quicksort(arr, i, high);
        }

        System.out.println(Arrays.toString(arr));

    }

}

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您可以查看link 以更好地了解快速排序及其工作原理。

    public static void quickSort(int[] arr, int low, int high) { if (arr == null || arr.length == 0) 返回;

            if (low >= high)
                return;
    
    
            int middle = low + (high - low) / 2;
            int pivot = arr[middle];
    
    
            int i = low, j = high;
            while (i <= j) {
                while (arr[i] < pivot) {
                    i++;
                }
    
                while (arr[j] > pivot) {
                    j--;
                }
    
                if (i <= j) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                    i++;
                    j--;
                }
            }
    
            // recursively sort two sub parts
            if (low < j)
                quickSort(arr, low, j);
    
            if (high > i)
                quickSort(arr, i, high);
        }
    

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 2017-05-18
      相关资源
      最近更新 更多