Java函数-如何实现快速排序
发布时间:2023-06-21 00:36:37
快速排序是一种基于分治思想的高效排序算法,其最坏时间复杂度为O(n2),但平均情况下时间复杂度为O(n*logn),并经常被认为是最快的基于比较的排序算法之一。
实现快速排序的基本思路是:选择一个关键字作为基准值,然后将小于基准值的元素放在它的左侧,大于基准值的元素放在它的右侧,递归地对左右两个子序列进行分治排序,直到所有的子序列只有一个元素为止。
以下是实现快速排序的Java代码:
public class QuickSort {
public void sort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
quickSort(arr, 0, arr.length - 1);
}
private void quickSort(int[] arr, int left, int right) {
int i = left, j = right;
int pivot = arr[left + (right - left) / 2]; // 选择中间的数作为基准值
while (i <= j) {
while (arr[i] < pivot) { // 在左边找到 个大于基准值的数
i++;
}
while (arr[j] > pivot) { // 在右边找到 个小于基准值的数
j--;
}
if (i <= j) { // 将两个数交换位置
swap(arr, i, j);
i++;
j--;
}
}
// 递归地对左右两侧的子序列进行快速排序
if (left < j) {
quickSort(arr, left, j);
}
if (i < right) {
quickSort(arr, i, right);
}
}
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
在快速排序中,我们选择中间的数作为基准值,也可以选择 个数或最后一个数作为基准值,但需要注意,当数组已经有序或接近有序时,选择 个数或最后一个数作为基准值可能会导致快速排序的效率降低。因此,选择中间的数作为基准值更为合适。
快速排序的时间复杂度取决于基准值的选择和数据的分布情况,最坏情况下时间复杂度为O(n2),但平均情况下时间复杂度为O(n*logn)。快速排序较为适合处理大规模数据的排序问题。
