Java 为什么这个快速排序代码在使用Hoare';什么是分区? 类快速排序{ 公共静态void main(字符串[]args){ int arr[]={8,3,5,1,34,6,35,5,23,2,7}; int n=阵列长度; 用于(整数x:arr) 系统输出打印(x+“”); System.out.println(); qSort(arr,0,n-1); 用于(整数x:arr) 系统输出打印(x+“”); } 静态整数分区(整数arr[],整数l,整数h){ int pivot=arr[h]; int i=l-1,j=h+1; while(true){ 做{ i++; }while(arr[i]pivot); 如果(i>=j) 返回j; 互换(i、j、arr); } } 静态无效qSort(整数arr[],整数l,整数h){ if(l

Java 为什么这个快速排序代码在使用Hoare';什么是分区? 类快速排序{ 公共静态void main(字符串[]args){ int arr[]={8,3,5,1,34,6,35,5,23,2,7}; int n=阵列长度; 用于(整数x:arr) 系统输出打印(x+“”); System.out.println(); qSort(arr,0,n-1); 用于(整数x:arr) 系统输出打印(x+“”); } 静态整数分区(整数arr[],整数l,整数h){ int pivot=arr[h]; int i=l-1,j=h+1; while(true){ 做{ i++; }while(arr[i]pivot); 如果(i>=j) 返回j; 互换(i、j、arr); } } 静态无效qSort(整数arr[],整数l,整数h){ if(l,java,algorithm,sorting,quicksort,partitioning,Java,Algorithm,Sorting,Quicksort,Partitioning,当我选择pivot作为arr[l]时,它会工作,但是会产生stackoverflow错误,因为当pivot被选择为arr[h]时,如果递归。 选择支点重要吗?如果有什么关系,你能告诉我为什么吗?如果选择arr[h]作为轴心,那么Hoare分区方案将不起作用。它将适用于arr[l]到arr[h-1]的任何其他元素。当尺寸减小到2个元素时,即h=l+1,且a[l]

当我选择pivot作为arr[l]时,它会工作,但是会产生stackoverflow错误,因为当pivot被选择为arr[h]时,如果递归。
选择支点重要吗?如果有什么关系,你能告诉我为什么吗?

如果选择arr[h]作为轴心,那么Hoare分区方案将不起作用。它将适用于arr[l]到arr[h-1]的任何其他元素。当尺寸减小到2个元素时,即h=l+1,且a[l]
特别是对于霍尔分区方案,选择arr[(l+h)/2]作为支点。这取决于h=l+1时除以2取整为l。

非常感谢。我终于明白了:D
class QuickSort {
public static void main(String[] args) {
    int arr[] = { 8, 3, 5, 1, 34, 6, 35, 5, 23, 2, 7 };
    int n = arr.length;
    for (int x : arr)
        System.out.print(x + " ");
    System.out.println();
    qSort(arr, 0, n - 1);
    for (int x : arr)
        System.out.print(x + " ");

}

static int partition(int arr[], int l, int h) {
    int pivot = arr[h];
    int i = l - 1, j = h + 1;
    while (true) {
        do {
            i++;
        } while (arr[i] < pivot);
        do {
            j--;
        } while (arr[j] > pivot);
        if (i >= j)
            return j;
        swap(i,j,arr);
    }
}

static void qSort(int arr[], int l, int h) {
    if (l < h) {
        int p = partition(arr, l, h);
        qSort(arr, l, p);
        qSort(arr, p + 1, h);
    }
}}