欢迎访问宙启技术站
智能推送

Java 中如何使用函数实现快速排序?

发布时间:2023-05-23 19:14:54

快速排序是一种高效的排序算法,它采用分治思想,将一个数组划分成两部分,一部分小于某个值,另一部分大于等于该值,然后递归地对这两部分进行排序,直到数组被完全排序。在 Java 中,我们可以使用函数实现快速排序。

首先,我们需要定义一个快速排序函数,用于排序数组。这个函数需要至少两个参数:数组和数组的左右边界。左右边界用于确定需要排序的数组的范围。函数的实现如下:

public static void quickSort(int[] arr, int low, int high) {
    if (low < high) {
        int pivotIndex = partition(arr, low, high); // 计算划分点的下标
        quickSort(arr, low, pivotIndex - 1); // 对划分点左边的子数组排序
        quickSort(arr, pivotIndex + 1, high); // 对划分点右边的子数组排序
    }
}

上面的函数中,我们先判断数组的左右边界是否合法(如果左边界大于等于右边界,则数组为空或只有一个元素,无需排序)。如果左右边界合法,就调用 partition 函数来计算划分点的下标。然后,我们将数组划分为两个子数组:左侧子数组包含小于划分点的所有元素,右侧子数组包含大于等于划分点的所有元素。之后,我们递归地对子数组进行排序,对左侧子数组调用 quickSort 函数,对右侧子数组调用 quickSort 函数。

接下来,我们需要实现 partition 函数,用于计算划分点的下标。这个函数需要三个参数:数组、数组的左右边界和划分点的值。函数的实现如下:

public static int partition(int[] arr, int low, int high) {
    int pivot = arr[low]; // 选择      个元素作为划分点
    while (low < high) {
        // 从右往左查找      个小于划分点的元素
        while (low < high && arr[high] >= pivot) {
            high--;
        }
        // 将小于等于划分点的元素移到左侧子数组
        arr[low] = arr[high];

        // 从左往右查找      个大于划分点的元素
        while (low < high && arr[low] < pivot) {
            low++;
        }
        // 将大于划分点的元素移到右侧子数组
        arr[high] = arr[low];
    }
    // 将划分点插入到最终的位置
    arr[low] = pivot;
    // 返回划分点的下标
    return low;
}

在上面的函数中,我们定义了一个变量 pivot,用于保存划分点的值。我们选择数组的 个元素作为划分点。然后,我们使用双指针法遍历数组,找到 个小于划分点的元素和 个大于划分点的元素,将它们交换位置。这样,我们就将小于划分点的元素移到了左侧子数组,将大于划分点的元素移到了右侧子数组。重复这个过程,直到左右指针重合。最后,我们将划分点插入到最终的位置,返回划分点的下标。

现在,我们已经实现了快速排序的函数和划分函数,我们可以编写一个简单的示例程序来使用这些函数。示例程序如下:

public static void main(String[] args) {
    int[] arr = {5, 1, 7, 4, 6, 2, 3, 8};
    quickSort(arr, 0, arr.length - 1);
    System.out.println(Arrays.toString(arr));
}

上面的程序首先定义了一个数组 arr,包含需要排序的元素。然后,我们调用 quickSort 函数,对这个数组进行排序。最后,我们使用 Arrays.toString 函数将排序后的数组打印出来。

在上面的程序中,快速排序算法会对数组进行递归划分,直到数组被划分成只有一个元素的子数组。最终,子数组被按照从小到大的顺序合并起来,形成了一个有序的数组。这个过程的时间复杂度为 O(n log n),是一种非常高效的排序算法。