Java函数——如何实现快速排序算法?
发布时间:2023-05-28 18:02:20
快速排序是一种基于比较的排序算法,其使用了分治的方法,在待排序序列中选择一个元素作为基准值,将序列中比基准值小的元素移动到基准值前面,比基准值大的元素移动到基准值后面,然后对基准值前后的子序列分别进行快速排序,递归地重复上述步骤,最终完成整个序列的排序。
下面详细介绍如何在Java中实现快速排序算法。
1. 实现思路
(1)选择基准值
选择待排序序列中的一个元素作为基准值。
(2)划分子序列
将待排序序列中比基准值小的元素移动到基准值前面,比基准值大的元素移动到基准值后面,得到两个子序列。
(3)递归排序
对基准值前后的子序列分别进行快速排序,递归地重复上述步骤,最终完成整个序列的排序。
2. 实现过程
(1)实现选择基准值的方法:
private static int partition(int[] arr, int left, int right) {
int pivot = arr[left]; // 选择待排序序列的 个元素作为基准值
while (left < right) {
while (left < right && arr[right] >= pivot) {
right--;
}
arr[left] = arr[right];
while (left < right && arr[left] <= pivot) {
left++;
}
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
该方法接收待排序序列arr、子序列的左边界left和右边界right作为参数,选择arr[left]作为基准值pivot,并将序列中比pivot小的元素移动到pivot的左边,比pivot大的元素移动到右边。最终返回pivot在序列中的位置,该位置左边的元素都比pivot小,右边的元素都比pivot大。
(2)实现快速排序的方法:
public static void quickSort(int[] arr, int left, int right) {
if (left < right) {
int p = partition(arr, left, right); // 划分子序列
quickSort(arr, left, p - 1); // 对左半部分进行快速排序
quickSort(arr, p + 1, right); // 对右半部分进行快速排序
}
}
该方法接收待排序序列arr、子序列的左边界left和右边界right作为参数,使用partition方法对子序列进行划分,并对基准值左右两边的子序列递归地调用快速排序方法,重复执行上述过程,直到序列中只有一个元素或没有元素时,排序完成。
3. 测试代码
以下是在Java中实现快速排序并进行测试的代码:
public class QuickSortExample {
public static void quickSort(int[] arr, int left, int right) {
if (left < right) {
int p = partition(arr, left, right);
quickSort(arr, left, p - 1);
quickSort(arr, p + 1, right);
}
}
private static int partition(int[] arr, int left, int right) {
int pivot = arr[left];
while (left < right) {
while (left < right && arr[right] >= pivot) {
right--;
}
arr[left] = arr[right];
while (left < right && arr[left] <= pivot) {
left++;
}
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
public static void main(String[] args) {
int[] arr = {5, 2, 8, 5, 1, 9, 3, 7};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
}
输出结果为:
[1, 2, 3, 5, 5, 7, 8, 9]
说明快速排序算法实现成功。
4. 总结
快速排序算法是一种高效的排序算法,其时间复杂度为O(nlogn),在实际应用中被广泛使用。在Java中实现快速排序算法需要注意确定基准值的方法和递归实现快速排序方法。
