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

Java函数实现如何对数组进行快速排序?

发布时间:2023-06-12 17:01:44

快速排序是一种基于分治思想的排序算法,它的核心思想是通过一次排序将数组分成两个部分,左边部分的所有元素都小于右边部分的元素,并且左右两个部分的元素都是已经排好序的。接着分别递归地对左半部分和右半部分进行排序,最终得到一个完全有序的数组。

以下是一个基于Java实现的快速排序函数:

public static void quickSort(int[] arr, int low, int high) {
    // 如果数组为空或者只有一个元素,则已经排好序,直接返回
    if (arr == null || arr.length < 2 || low >= high) {
        return;
    }

    // 确定枢轴元素,将数组分成左右两部分
    int pivotIndex = partition(arr, low, high);

    // 递归地对左半部分和右半部分进行排序
    quickSort(arr, low, pivotIndex - 1);
    quickSort(arr, pivotIndex + 1, high);
}

// 将数组分成两个部分,左半部分小于枢轴元素,右半部分大于枢轴元素
public static int partition(int[] arr, int low, int high) {
    // 取      个元素作为枢轴元素
    int pivot = arr[low];
    int i = low + 1;
    int j = high;

    while (i <= j) {
        // 从左边开始,找到      个大于枢轴元素的元素
        while (i <= j && arr[i] < pivot) {
            i++;
        }

        // 从右边开始,找到      个小于枢轴元素的元素
        while (i <= j && arr[j] > pivot) {
            j--;
        }

        // 交换左右两个元素位置
        if (i < j) {
            swap(arr, i, j);
        }
    }

    // 把枢轴元素放到正确的位置上
    swap(arr, low, j);

    // 返回枢轴元素的位置
    return j;
}

// 交换两个元素位置
public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

该函数包含三个部分:快速排序函数 quickSort、分割数组函数 partition 和交换元素位置函数 swap

快速排序函数首先检查数组是否为空或只有一个元素,如果是,则认为数组已经排好序,直接返回。接着调用分割数组函数 partition,将数组分成左右两部分,其中,左半部分所有元素小于枢轴元素,右半部分所有元素大于枢轴元素。然后递归地对左半部分和右半部分分别进行排序,最终得到一个排好序的数组。

分割数组函数 partition 首先选取左边 个元素作为枢轴元素 pivot,然后从左边开始找到 个大于枢轴元素的元素,从右边开始找到 个小于枢轴元素的元素。如果左边和右边找到的元素分别位于枢轴元素的左侧和右侧,则交换这两个元素的位置。在整个过程中,左边指针 i 和右边指针 j 都是从两端向中间逼近的,直到它们相遇为止。最后,把枢轴元素放到正确的位置上,该位置的索引即为 j,并且返回该索引值。

交换元素位置函数 swap 用来交换两个数组元素的位置。

总的来说,快速排序算法的时间复杂度为 $O(n \log n)$,空间复杂度为 $O(\log n)$。它比大多数 $O(n^2)$ 的排序算法都要快,是常用的排序算法之一。