如何在Java中使用递归实现快速排序函数?
发布时间:2023-06-22 12:32:49
快速排序(Quick Sort)是一种高效的排序算法,它通过分治的思想将一个大问题分解为若干个小问题,并且每个小问题都有自己的解决方案,然后将这些解决方案合并起来,得到整体的解决方案。快速排序算法的基本思路是,在数组中选择一个基准值,然后把大于这个基准值的元素放置到右边,小于等于这个基准值的元素放置到左边,然后递归地对左右两个子数组进行排序。
在Java中使用递归实现快速排序的代码如下:
public class QuickSort {
public static void main(String[] args) {
int[] arr = {5, 9, 1, 4, 2, 8, 3, 7, 6};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int i = left;
int j = right;
int pivot = arr[left];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
arr[i] = arr[j];
while (i < j && arr[i] < pivot) {
i++;
}
arr[j] = arr[i];
}
arr[i] = pivot;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
这个快速排序函数接收一个整型数组、一个左指针和一个右指针作为参数。左指针和右指针分别指向需要排序的子数组的 个和最后一个元素。递归结束的条件是左指针大于等于右指针,此时表示子数组已经排序完成。
在函数内部,先定义了三个指针:i、j和pivot。其中,i和j分别指向子数组的左右两端,同时pivot为选定的基准值,初始化为子数组的 个元素。
然后,在while循环中,我们先从右向左遍历整个子数组,找到 个小于pivot的元素,并将其放置到左侧的位置。然后从左向右遍历整个子数组,找到 个大于等于pivot的元素,并将其放置到右侧的位置。重复这个过程,直到i指针和j指针相遇为止。此时将pivot放置在数组中间位置,然后递归地对左侧和右侧的子数组进行排序。
快速排序的时间复杂度为$O(nlogn)$,空间复杂度为$O(1)$,是一种性能优异的排序算法。
