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

Java中如何实现快速排序?

发布时间:2023-06-11 05:32:11

快速排序是一种常见的排序算法,Java的实现方法也较简单,下面将介绍Java中实现快速排序的步骤和注意事项。

1.实现算法流程:

(1)选取一个基准数。

(2)把小于基准数的数移到左边,大于基准数的数移到右边。

(3)分别对左右两个子序列进行递归排序。

2.Java代码实现:

(1)首先定义一个快速排序函数,传入的参数为待排序数组和起始位置和结尾位置:

public static void quickSort(int[] arr, int left, int right)

(2)在函数体内定义一个指针leftPoint,从左往右扫描数组,找到比基准数大的数,定义一个指针rightPoint,从右往左扫描数组,找到比基准数小的数。

(3)如果leftPoint<rightPoint,则交换左右两个位置的数,重复此过程,直到leftPoint>=rightPoint。

(4)如果left<rightPoint,则交换left位置和rightPoint位置的数,然后递归调用quickSort函数,对左半部分进行排序。

(5)如果leftPoint<right,则交换left位置和rightPoint位置的数,然后递归调用quickSort函数,对右半部分进行排序。

(6)最后的结果就是已经排好序的数组。

完整代码如下:

public class QuickSort {

    public static void main(String[] args) {

        int[] arr = {12, 45, 48, 25, 19, 17, 8, 22};

        quickSort(arr, 0, arr.length - 1);

        System.out.println(Arrays.toString(arr));

    }

    public static void quickSort(int[] arr, int left, int right) {

        int leftPoint = left;

        int rightPoint = right;

        int base = arr[left];//选取第一个数作为基准数

        while (leftPoint < rightPoint) {

            while (leftPoint < rightPoint && arr[rightPoint] > base) {//从右往左扫描,找到比基准数小的数

                rightPoint--;

            }

            while (leftPoint < rightPoint && arr[leftPoint] <= base) {//从左往右扫描,找到比基准数大的数

                leftPoint++;

            }

            if (leftPoint < rightPoint) {//如果左指针小于右指针

                swap(arr, leftPoint, rightPoint);//交换左右两个数的位置

            }

        }

        swap(arr, left, leftPoint);//交换基准数和左指针所在位置的数

        if (left < leftPoint) {

            quickSort(arr, left, leftPoint - 1);//递归对左半段排序

        }

        if (leftPoint < right) {

            quickSort(arr, leftPoint + 1, right);//递归对右半段排序

        }

    }

    public static void swap(int[] arr, int i, int j) {

        int temp = arr[i];

        arr[i] = arr[j];

        arr[j] = temp;

    }

}

3.注意事项:

(1)基准数的选取是影响快排效率的关键,如果选取的基准数不够随机或者过于极端,都会造成快排效率的下降。

(2)快排的时间复杂度为O(nlogn),但是最坏情况下时间复杂度为O(n2),因此在使用快排时,需要注意数据分布情况。

(3)在实现快排时,需要注意数组下标的边界问题,否则可能会导致数组越界异常。