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

通过Java函数实现快速排序

发布时间:2023-05-27 08:00:09

快速排序是一种常见的排序算法,其运用了一种分治的思想,将排序问题划分为多个子问题,再分别处理,最后合并结果。快速排序是一种高效的排序算法,尤其适用于大数据量的排序。本文将通过Java函数实现快速排序。

1. 算法流程

快速排序的基本思想是:先从序列中取出一个数作为基准数(通常是 个数),然后将序列中所有小于基准数的数放到基准数的左边,将大于基准数的数放到基准数的右边,再分别对左右两边的序列重复这个过程,直到整个序列有序。整个排序过程可以用如下的递归函数实现:

public static void quickSort(int[] arr, int left, int right) {
    if (left >= right) return;
    int i = left, j = right, pivot = arr[left]; // pivot是基准数
    while (i < j) {
        while (i < j && arr[j] >= pivot) j--;
        if (i < j) arr[i++] = arr[j];
        while (i < j && arr[i] <= pivot) i++;
        if (i < j) arr[j--] = arr[i];
    }
    arr[i] = pivot;
    quickSort(arr, left, i - 1); // 对左边的子序列排序
    quickSort(arr, i + 1, right); // 对右边的子序列排序
}

上面的函数采用了双指针的方式实现快速排序。首先,以序列的 个数为基准数,定义变量left和right表示左右两端的索引位置。从右到左遍历序列,找到 个小于基准数的数,将其放到基准数左侧。然后从左到右遍历序列,找到 个大于基准数的数,将其放到基准数右侧。如此循环进行,直到左右指针相遇。

下面是一个例子,说明该算法是如何对序列进行排序的。

![image](https://user-images.githubusercontent.com/46817444/132412357-dc3b13d7-6f3a-458a-93a4-46d1ea6d0d54.png)

最终数组的排序结果为:[5, 6, 9, 11, 13, 16, 28, 39, 59, 78, 94, 99, 100]

2. 算法分析

快速排序是一种原地排序算法,即不需要额外的内存空间来存储临时数据。其时间复杂度为O(NlogN),在最坏情况下为O(N^2)。最坏情况出现在序列已经有序的情况下,或者全部元素都相等的情况下。为了避免出现最坏情况,可以选择随机选择基准数,或者采用三数取中法来选择基准数。

3. 示例代码

下面是一个示例代码,展示了如何通过Java函数实现快速排序。

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {16, 39, 13, 11, 100, 6, 5, 78, 99, 28, 59, 94, 9};
        quickSort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    public static void quickSort(int[] arr, int left, int right) {
        if (left >= right) return;
        int i = left, j = right, pivot = arr[left];
        while (i < j) {
            while (i < j && arr[j] >= pivot) j--;
            if (i < j) arr[i++] = arr[j];
            while (i < j && arr[i] <= pivot) i++;
            if (i < j) arr[j--] = arr[i];
        }
        arr[i] = pivot;
        quickSort(arr, left, i - 1);
        quickSort(arr, i + 1, right);
    }
}