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

如何使用Java编写一个快速排序函数?

发布时间:2023-05-21 19:15:39

快速排序是一种经典的排序算法,采用分治思想实现,其时间复杂度平均为O(nlogn)。其基本思想是选择一个基准元素,将数组分为两部分,一部分小于基准数,另一部分大于等于基准数,然后递归的对两个子数组进行排序,直到数组有序。

Java代码实现快速排序:

public static void quickSort(int[] arr, int left, int right) {
    if (left < right) {
        int i = left, j = right, x = arr[left];
        while (i < j) {
            while (i < j && arr[j] >= x) {
                j--;  
            }
            if (i < j) {
                arr[i++] = arr[j];
            }
            while (i < j && arr[i] < x) {
                i++;  
            }
            if (i < j) {
                arr[j--] = arr[i];
            }
        }
        arr[i] = x;
        quickSort(arr, left, i - 1); 
        quickSort(arr, i + 1, right);
    }
}

其中,left为数组左边界,right为数组右边界。在排序前需要指定这两个值,通常为left=0,right=arr.length-1。

具体实现思路为:首先选择左边 个元素作为基准元素x,定义i和j分别指向数组的左右两端。从右往左找到 个小于x的元素arr[j],把该元素赋值给arr[i],然后从左往右找到 个大于等于x的元素arr[i],把该元素赋值给arr[j]。重复这个过程直到i=j,最后把基准元素x赋值给arr[i]。此时,x左边的元素均小于x,右边的元素均大于等于x。然后递归的对左右两个子数组进行排序。

快速排序的缺点是当数组已经有序或者近似有序时,其性能将退化到O(n^2),因此我们可以采用随机化快排或者三向切分的方式来避免这种情况。