这个快速排序的代码发生了什么?

问题描述 投票:0回答:1

我找到了这个快速排序的代码实现我想问:代码中粗体部分是做什么的?正在检查数组左右部分是否有未排序的元素?

导入java.util.Scanner;

公共类快速排序{ 静态 int a[];

public static void main(String[] args) {
     Scanner sc = new Scanner(System.in);
        System.out.print("n = ");
        int n = sc.nextInt();

        System.out.println("Array: ");
        a = new int[n];

        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }

        
        quickSort(0 , n - 1);
       
        System.out.println("Sorted array: ");
        for (int i = 0; i < n; i++) {
            System.out.print(a[i] + " ");
        }
        
        sc.close();

}

private static void quickSort(int left, int right) {
    int i = left, j = right;
    
    
    int pivot = a[(left + right)/ 2]; 
    
    
    while(i <= j) {
        while(a[i] < pivot) {
            i++;
        }
        
        while(a[j] > pivot) {
            j--;
        }
        
        if(i <= j) {
            swap(a, i, j);
            i++; j--;
        }
    }
    
    **if(left < j) {
        quickSort(left, j);
    }
    
    if(i < right) {
        quickSort(i, right);
    }**
}

private static void swap(int a[], int index1, int index2) {
    int aux = a[index1];
    a[index1] = a[index2];
    a[index2] = aux;
}

}

我试图理解代码在做什么。

quicksort
1个回答
0
投票

检查数组左右部分是否有未排序的元素?

是的,就是这样!

它负责在数组的左右分区上递归调用

quickSort
函数。

将数组初始划分为两个子数组(左和右)后,对每个子数组调用

quickSort
函数以进一步对它们进行排序。这个过程递归地继续,直到子数组变成单个元素或为空,此时排序完成。

因此,粗体代码块本质上是检查左右子数组中是否仍然存在未排序的元素,并递归地应用

quickSort
函数对这些子数组进行排序。这个递归过程最终将整个数组按升序排序。

© www.soinside.com 2019 - 2024. All rights reserved.