繁体   English   中英

无法在我的quicksort实现中调用sort方法

[英]Cannot call the sort method in my quicksort implementation

我正在尝试使用Java编写快速排序算法。 我的问题是,我无法调用sort方法。 这是我的代码:

public class quickSort
{

int  partition(int a[], int left, int right)
{
    int i= left, j= right, temp;
    int pivot=a[j];
    //System.out.println(pivot+"pivot");
    while(i<=j)
    {
        while(a[i]<pivot)
            i++;
        while(a[j-1]>pivot)
            j++;

        if(i<j)
        {
            temp=a[i];
            a[i]=a[j-1];
            a[j-1]=temp;
            System.out.println(a[i] +"i");
            System.out.println(a[j-1] +"j");
            i++;
            j--;
        }
    }
    System.out.println(i);
    System.out.println(j);
    return i;
}
int[] sort(int[] numbers, int left, int right)
{
    int x = partition(numbers, left, right);
    System.out.println(x +"Qi");
    if(left < right)
        sort(numbers, left, x-1);
        sort(numbers, x+1, right);
    return numbers; 
}


public static void main(String[] args)
    {
    quickSort q= new quickSort();

    int[] numbers = {2,6,4,9,7,0,1,3,5}; 
    int left = 0, right=numbers.length-1;
    q.sort(numbers, left, right);
    }
}

问题:

sort(numbers, left, x-1);
sort(numbers, x+1, right); 

此递归未执行

当我尝试在分区方法中编写代码时,也会导致超出范围的异常。

这是输出的屏幕截图,我只是用它来显示输出和显示我以前执行的IDE: https : //drive.google.com/file/d/1j6lHuEONZkO_Dr3ZszoPKh4bNXZgkgbT/view?usp=sharing

当前代码在分区方法中会产生无限循环或ArrayIndexOutOfBoundsException,具体取决于您选择的数字数组。 可能的解决方法是:

private int partition(int a[], int left, int right) {
    int i = left, j = right, temp;
    int pivot = a[j];
    while (i <= j) {
        if (a[i] > pivot) {
            temp = a[i];
            for (int k = i; k < right; k++) { // remove a[i] and move all elements...
                a[k] = a[k + 1];              // ...following a[i] to the left
            }
            j--;                              // decrement pivot's index
            a[right] = temp;                  // move a[i] to the right end
        } else {
            i++;
        }
    }
    return j;                                 // return pivot's modified index
}

此外,在排序方法中,您必须确保两个递归排序调用的左边界都小于右边界,例如:

private int[] sort(int[] numbers, int left, int right) {
    int x = partition(numbers, left, right);
    if (left < right) { // left boundary smaller than right one
        sort(numbers, left, x - 1);
        sort(numbers, x + 1, right); 
    }
    return numbers;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM