Java-实现快速排序

Java-实现快速排序,java,algorithm,Java,Algorithm,我正在学习数据结构和算法。因此,我尝试实现快速排序算法 public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = new int[] { 10, 16, 8, 12, 15, 6, 3, 9, 5 }; quickSort(0, arr.length - 1, arr); } public static void quickSort(int star

我正在学习数据结构和算法。因此,我尝试实现快速排序算法

public static void main(String[] args) {
    // TODO Auto-generated method stub

    int[] arr = new int[] { 10, 16, 8, 12, 15, 6, 3, 9, 5 };

    quickSort(0, arr.length - 1, arr);
}

public static void quickSort(int start, int end, int[] arr) {

    if (start < end) {

        int partitionIndex = partition(start, end, arr);
        quickSort(start, partitionIndex - 1, arr);
        quickSort(partitionIndex+1, end, arr); // When passing partitionIndex+1 in the swap method it throws index out of bound exception

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

}

public static int partition(int start, int end, int[] arr) {

    int pivot = arr[end];
    int pIndex = start;

    for (int i = 0; i < end - 1; i++) {

        if (arr[i] <= pivot) {
            swap(i, pIndex, arr);
            pIndex++;
        }
    }

    swap(pIndex, end, arr);
    return pIndex;

}

private static void swap(int i, int index, int[] arr) {

    int temp = arr[i];
    arr[i] = arr[index]; // index out of bound exception is thrown
    arr[index] = temp;

}
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
int[]arr=新的int[]{10,16,8,12,15,6,3,9,5};
快速排序(0,arr.length-1,arr);
}
公共静态void快速排序(int start、int end、int[]arr){
如果(开始<结束){
int partitionIndex=分区(开始、结束、arr);
快速排序(开始,分区索引-1,arr);
快速排序(partitionIndex+1,end,arr);//在swap方法中传递partitionIndex+1时,它将索引抛出绑定异常
System.out.println(Arrays.toString(arr));
}   
}
公共静态int分区(int开始、int结束、int[]arr){
int pivot=arr[end];
int pIndex=开始;
对于(int i=0;i如果(arr[i]我假设您试图从实现Lomuto分区方案。如果是这种情况,您的代码中有两个错误,都是在
分区方法的
for
循环中:

  • 起始索引:
  • 您的算法每次都从0开始。这会导致
    索引自动边界异常
    ,因为它会交换
    pIndex
    ,即在末尾的
    数组.length
    。如果您解决了这个问题,异常将消失,但排序结果将是
    [3,5,8,10,12,15,6,16,9]
    ,这显然不是完美的排序

  • 结束条件:

  • 这里的错误是,每次都缺少最后一次迭代,因为您的结束条件是
    i
    将其更改为
    i
    i,如果我将其更改为i快速排序
    方法?不确定,具体更改位置。您能告诉我吗?
    partitionIndex+1
    正在运行第二次递归调用需要。我在答案中添加了
    快速排序
    方法,所以现在就完成了,除了
    交换
    方法。