欢迎访问宙启技术站
智能推送

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)。快速排序较为适合处理大规模数据的排序问题。