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

Java中的数组如何实现快速排序

发布时间:2023-06-05 17:15:26

快速排序是一种使用分治法的排序算法,其基本思想是先找到一个基准值,然后将待排序序列分为小于等于基准值和大于基准值两部分,再对这两部分进行递归排序,最终得到一个有序序列。快速排序的排序速度非常快,也是常见的排序算法之一。在Java中,数组如何实现快速排序呢?下面我们就来详细地介绍一下。

一、快速排序的原理

快速排序的基本思路是:

1.选择一个基准值,将待排序序列分为小于等于基准值和大于基准值两部分;

2.对两个子序列分别进行递归排序。

快速排序的关键在于如何划分序列。通常采用的方法是选取其中一个元素为基准值,将数组中小于等于它的元素移到它的左侧,大于它的元素移到它的右侧。这个过程又叫做一次划分(partition)。

二、Java中数组的快速排序实现

Java中的快速排序,可以使用Arrays.sort()方法来实现,该方法使用的是双轴快排(Dual-Pivot Quicksort),是对基本快速排序的改进。它使用两个基准值而不是一个,可以更快地排序数组。

但是为了更好地理解快速排序的实现原理,我们可以手动实现一个快速排序的算法。

具体实现如下:

public static void quickSort(int[] arr, int left, int right) {
    // 判断数组是否为空或者长度小于2
    if (arr == null || arr.length < 2) {
        return;
    }
    // 判断左右下标是否合法
    if (left < right) {
        // 对数组进行划分,获取分界点
        int mid = partition(arr, left, right);
        // 对左边的子数组进行快速排序
        quickSort(arr, left, mid - 1);
        // 对右边的子数组进行快速排序
        quickSort(arr, mid + 1, right);
    }
}

/**
 * 对数组进行划分,并获取分界点
 */
public static int partition(int[] arr, int left, int right) {
    // 选择数组      个元素作为基准值
    int pivot = arr[left];
    // 左右指针
    int i = left, j = right;
    // 循环划分数组
    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;
    // 返回分界点
    return i;
}

三、快速排序的时间复杂度

快速排序的排序速度非常快,时间复杂度为O(nlogn)。但是当序列已经有序或者接近有序时,快速排序的效率会明显下降,时间复杂度甚至会退化为O(n^2)。所以,在实际使用时,需要对快速排序进行优化,例如在划分过程中随机选取基准值,或者采用双轴快排等。