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)。所以,在实际使用时,需要对快速排序进行优化,例如在划分过程中随机选取基准值,或者采用双轴快排等。
