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

Java函数如何实现快速排序算法?

发布时间:2023-06-26 08:30:31

快速排序(Quick sort)是一种基于比较的排序算法。它是一种分而治之策略,基于递归实现,将数组分成两个子数组分别排序,然后合并。它的性能比其他排序算法(如归并排序、堆排序等)好,因为其平均时间复杂度为O(nlogn),在最坏情况下为O(n^2)。下面我们来实现Java中的快速排序算法。

1、分析算法

快速排序是一种常见的排序算法,其基本原理如下:

1.选取一个基准值pivot。

2.分别从左右两端向中间扫描,大于基准值的元素移到右侧,小于基准值的元素移到左侧,完成后将pivot放到最终位置。

3.依次对左右两个子序列重复此过程,直到序列长度为1,则排序完成。

2、实现算法

对于该算法而言,我们主要需要实现三个操作:

1.选择一个基准值pivot。

2.划分数组,将小于pivot的元素移到pivot前面,大于pivot的元素移到pivot后面。

3.递归地进行第二步操作,直至完成排序。

下面我们结合代码来具体实现。

(1)选取基准值pivot

// 选取最右侧的元素作为基准值

int pivotIndex = right;

然后我们可以取数组中的最左侧、最右侧、中间三种元素,计算它们的中位数,并将其设为pivot。

(2)划分数组

对于快速排序算法的重点在于如何划分数组,将小于pivot的元素移到pivot前面,大于pivot的元素移到pivot后面。

我们可以使用两个指针,一个指向数组的最左端,一个指向数组的最右端。首先将左端指针指向第一个元素,右端指针指向最后一个元素;然后将pivot值存储起来,并将左端指针向右移动,直到指向的元素大于或等于pivot;随后将右端指针向左移动,直到指向的元素小于或等于pivot。交换左端和右端指针指向的元素并继续移动,当左端的指针超过右端的指针结束。

例如,给定数组[5, 3, 7, 6, 2, 1, 4, 8]时,假设我们选择pivot=5。使用上述划分方法,第一次划分后数组变为[1, 3, 2, 4, 5, 7, 6, 8]。在该数组中,左端指针指向1,右端指针指向8,pivot为5。

代码如下:

    private int partition(int[] array, int left, int right) {

        int pivotIndex = right;

        int pivotValue = array[pivotIndex];

        int storeIndex = left;

        for (int i = left; i < right; i++) {

            if (array[i] < pivotValue) {

                swap(array, i, storeIndex);

                storeIndex++;

            }

        }

        swap(array, storeIndex, pivotIndex);

        return storeIndex;

    }

(3)递归排序

当划分完成后,我们得到了基准值所在的位置,因此我们要将数组分成两部分,分别对其进行递归排序,直至子数组长度为1。

代码如下:

    private void quickSort(int[] array, int left, int right) {

        if (left < right) {

            int pivotIndex = partition(array, left, right);

            quickSort(array, left, pivotIndex-1);

            quickSort(array, pivotIndex+1, right);

        }

    }

(4)组合排序方法

将上述3个操作组合起来,最终形成快速排序算法的完整实现。

代码如下:

    private void quickSort(int[] array) {

        int left = 0;

        int right = array.length-1;

        quickSort(array, left, right);

    }

    private int partition(int[] array, int left, int right) {

        int pivotIndex = right;

        int pivotValue = array[pivotIndex];

        int storeIndex = left;

        for (int i = left; i < right; i++) {

            if (array[i] < pivotValue) {

                swap(array, i, storeIndex);

                storeIndex++;

            }

        }

        swap(array, storeIndex, pivotIndex);

        return storeIndex;

    }

    private void swap(int[] array, int i, int j) {

        int tmp = array[i];

        array[i] = array[j];

        array[j] = tmp;

    }

    private void quickSort(int[] array, int left, int right) {

        if (left < right) {

            int pivotIndex = partition(array, left, right);

            quickSort(array, left, pivotIndex-1);

            quickSort(array, pivotIndex+1, right);

        }

    }

    public static void main(String[] args) {

        int[] array = {5, 3, 7, 6, 2, 1, 4, 8};

        QuickSort quickSort = new QuickSort();

        quickSort.quickSort(array);

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

    }

3、总结

本文介绍了Java中如何实现快速排序算法。快速排序是一种分而治之策略,通过递归实现的。Java中实现快速排序算法时,我们可以采取三个步骤:选择基准值、划分数组、递归排序。实现该算法的重点在于如何划分数组,先选取一个基准值,然后使用两个指针来遍历数组,将小于基准值的元素移到左边,大于基准值的元素移到右边。实现该算法后,我们可以使用单元测试来验证代码的正确性。