Java函数实现快速排序算法详解
快速排序是一种基于比较的排序算法,利用分治思想,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分小,然后分别对这两部分继续进行排序,以达到整个序列有序的目的。
快速排序的核心思想是选取一个基准值(pivot),将比基准值小的元素放在左边,比基准值大的元素放在右边。然后将左右两边的子序列分别递归地进行快速排序。具体实现如下:
1. 选择基准值,一般可以选择 个元素或者随机选择一个元素作为基准值。
2. 将比基准值小的元素移到基准值的左边,将比基准值大的元素移到基准值的右边,相等的元素可以任意放置左右两边。
3. 对左右两个子序列分别递归执行步骤1和步骤2。
Java代码实现:
public class QuickSort {
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int pivot = partition(arr, left, right);
quickSort(arr, left, pivot - 1);
quickSort(arr, pivot + 1, right);
}
private static int partition(int[] arr, int left, int right) {
int pivot = arr[left];
int i = left + 1, j = right;
while (true) {
while (i <= j && arr[i] < pivot) {
i++;
}
while (i <= j && arr[j] > pivot) {
j--;
}
if (i >= j) {
break;
}
swap(arr, i, j);
}
swap(arr, left, j);
return j;
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
在上面的代码中,quickSort方法是整个快速排序的入口函数,它使用递归的方式对左右两个子序列分别进行快速排序。partition方法是实现快速排序的核心代码,它利用双指针的方式,将比基准值小的元素移到基准值的左边,将比基准值大的元素移到基准值的右边,并返回基准值的下标。swap方法用于交换数组中两个元素的位置。
快速排序的时间复杂度是O(nlogn),空间复杂度是O(logn),是一种非常快速的排序算法。但是快速排序的实现可能存在一个问题,就是如果原始数组中存在大量重复元素,那么将导致快速排序的效率降低,甚至可能退化为O(n2)的时间复杂度。为了解决这个问题,可以使用三路快速排序算法,在快速排序的基础上,将数组分为三部分,分别是小于基准值、等于基准值和大于基准值。
