有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java快速排序算法有问题吗

快速排序Java实现- 我制作了一个程序来实现快速排序算法,但它并没有正确地显示已排序的序列,它还显示了数组越界索引异常。有人能说出代码或逻辑的错误吗

import java.util.*;

public class QuickSort{
    int num,arrayQS[],i;

    public void quicksort(int ar[],int start,int end){
        if(start<end){
            int pindex=partition(ar,start,end);
            System.out.println(pindex);
            quicksort(ar,start,pindex-1);
            quicksort(ar,pindex+1,end);
        }
    }
    public int partition(int pAR[],int start, int end){ //partition function

        int key;
        int swapper;
        int pivot=pAR[end];
        int pIndex=start;
        for(i=0;i<end;i++){
            if(pAR[i]<=pivot){
                //swapiing
                key=pAR[pIndex];
                pAR[pIndex]=pAR[i];
                pAR[i]=key;
                pIndex++;
            }
        }
        //swap
        swapper=pAR[pIndex];
        pAR[pIndex]=pAR[end];
        pAR[end]=swapper;
        return pIndex;
    }
    public void arrayInputFn(){
        Scanner in=new Scanner(System.in);
        System.out.println("enter the number you want to insert in an array");
        num=in.nextInt();
        arrayQS=new int[num];
        System.out.println("enter the elements in an array: ");
        for(i=0;i<num;i++){
            arrayQS[i]=in.nextInt();
        }
        quicksort(arrayQS,0,arrayQS.length-1);

        for(i=0;i<arrayQS.length;i++){
            System.out.print(arrayQS[i]);
        }
    }
    public static void main(String[] args){
        QuickSort qs=new QuickSort();
        qs.arrayInputFn();
    }
}

共 (1) 个答案

  1. # 1 楼答案

    for(i=0;i<end;i++){开始索引应该是start,而不是0。您正在将整个数组传递给该方法,但一次只能对其中的一部分进行排序(第一次调用除外),如startend所指定

    您还应该提取swap方法,使代码更加整洁

    public int partition(int pAR[], int start, int end) {
        int pivot = pAR[end];
        int pIndex = start;
        for (i = start; i < end; i++) {
            if (pAR[i] <= pivot) {
                swap(pAR, i, pIndex);
                pIndex++;
            }
        }
        swap(pAR, pIndex, end);
        return pIndex;
    }
    
    public void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }