Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的快速排序无法提供排序结果_Java_Quicksort - Fatal编程技术网

Java中的快速排序无法提供排序结果

Java中的快速排序无法提供排序结果,java,quicksort,Java,Quicksort,我尝试使用上面提到的算法实现快速排序代码 但是,我无法获得排序的输出。相反,我只得到与输出相同的数组 有人能帮我检查一下,告诉我我的代码有什么问题吗 public class QuickSort { private int[] arr; private void quick_sort(int[] input, int lo, int hi){ this.arr = input; if(lo<hi){ int p = partition(arr, lo,

我尝试使用上面提到的算法实现快速排序代码

但是,我无法获得排序的输出。相反,我只得到与输出相同的数组

有人能帮我检查一下,告诉我我的代码有什么问题吗

public class QuickSort {

private int[] arr;

private void quick_sort(int[] input, int lo, int hi){
    this.arr = input;
    if(lo<hi){
        int p = partition(arr, lo, hi);
        if(lo < p-1)
            quick_sort(arr, lo, p-1);
        if(hi > p+1)
            quick_sort(arr, p+1, hi);
    }
}

private int partition(int[] arr, int lo, int hi){
    int pivotIndex = hi;  //last element
    int pivotVal = arr[pivotIndex];
    int j = lo;

    for(int i = lo; i<hi; i++){
        if(arr[i] < pivotVal){
            swap(arr[j],arr[i]);
            j++;
        }
    }
    swap(arr[j],pivotVal);
    return j;
}

private void swap(int l, int r){
    l = l+r;
    r = l-r;
    l = l-r;
}


private void printArray(){
    for(int i : arr)
        System.out.print(i+", ");
}

public static void main(String[] args) {
    QuickSort q = new QuickSort();
    int[] input = {10, 5, 15, 3, 20, 30, 25, 19};
    q.quick_sort(input, 0, input.length-1);
    q.printArray();
}
};

您的交换方法不正确。Java总是按值传递的,原语不能这样修改。相反,传入数组(数组的值,作为
对象
实例,是它的“引用”)和要交换的索引

private void swap(int[] arr, int l, int r) {
    int t = arr[l];
    arr[l] = arr[r];
    arr[r] = t;
}
然后你可以这样称呼它

private int partition(int[] arr, int lo, int hi) {
    int pivotIndex = hi; // last element
    int j = lo;

    for (int i = lo; i < hi; i++) {
        if (arr[i] < arr[pivotIndex]) {
            swap(arr, j, i);
            j++;
        }
    }
    swap(arr, j, pivotIndex);
    return j;
}
此外,还可以按如下方式打印阵列:

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

部分回答:你的问题是你的交换方法。这不是一个真正的答案,但是这个页面有一些关于快速排序的非常好的信息和示例:哦,谢谢你,我怎么会错过这个。我只是交换值,但是我的数组如何“知道它”。啊,谢谢你。因为名声不好不能投票。但这很好用。还有一个问题。我已经使用这种方法交换了一段时间,因为它工作得很好。我在一些博客上读到,这是一个交换东西的好方法,因为你不需要;我不需要第三个变量,我应该不再使用它吗?它看起来像是的一个坏版本,我建议您不要在Java中使用它。相反,你应该这样做。而且,即使没有名声,作为询问者你也可以。
3, 5, 10, 15, 19, 20, 25, 30, 
System.out.println(Arrays.toString(arr));