登录 |  注册
首页 >  云计算&大数据 >  经典算法大全 · 实例详解 >  快速排序算法-(快排)

快速排序算法-(快排)

快速排序(QuickSort)是一种高效的比较排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想基于分治策略(divide and conquer):

  1. 选择基准(Pivot): 快速排序首先选择待排序数组中的一个元素作为基准。这个基准通常是数组中的某个固定位置的元素,也可以是随机选取的一个元素,或者通过某种策略选取以获得更好的平均性能。

  2. 分区(Partitioning): 接下来,算法将数组中的所有其他元素与基准进行比较,将小于基准的元素放在基准的左边,大于基准的元素放在基准的右边。这个过程完成后,基准处于最终排序后它应有的位置,而且左右两侧的元素都比基准更加有序。

  3. 递归排序子序列: 然后,对基准左右两侧的子序列分别进行快速排序。即对基准左边的子数组执行快速排序,对基准右边的子数组也执行快速排序。这个过程会一直递归下去,直到子数组只剩下一个元素或者为空,这时认为子数组本身就是有序的。

  4. 终止条件: 当递归到达叶子节点,也就是子数组的大小为1或0时,递归结束。

快速排序算法的关键在于其分区过程,它能够保证每次都能缩小问题规模,理论上平均时间复杂度为O(n log n),在实践中也非常高效。然而,最坏情况下(比如对于已经完全有序或完全逆序的输入),快速排序的时间复杂度会上升至O(n²),但通过对基准的选择进行优化(如三数取中法、随机化版本),可以在大多数实际场景下避免这种情况的发生。同时,快速排序是非稳定的排序算法,即相等元素的相对顺序可能在排序后改变。

快速排序.png

以下是Java实现快速排序算法的一个简单版本:

public class QuickSort {

    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            // Partition the array by finding the pivot index
            int pivotIndex = partition(arr, low, high);

            // Recursively sort elements on both sides of the pivot
            quickSort(arr, low, pivotIndex - 1); // Before pivot
            quickSort(arr, pivotIndex + 1, high); // After pivot
        }
    }

    private static int partition(int[] arr, int low, int high) {
        // Choose the last element as pivot
        int pivot = arr[high];
        int i = (low - 1); // Index of smaller element

        for (int j = low; j < high; j++) {
            // If current element is smaller than or equal to pivot
            if (arr[j] <= pivot) {
                i++;

                // Swap arr[i] and arr[j]
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }

        // Swap arr[i+1] and arr[high] (or pivot)
        int temp = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp;

        return i + 1;
    }

    // Driver method to test above
    public static void main(String args[]) {
        int[] arr = {9, 2, 4, 7, 3, 8, 1, 5, 6};
        int n = arr.length;

        quickSort(arr, 0, n - 1);

        System.out.println("Sorted array: ");
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}

这段代码首先定义了一个quickSort方法,接受数组和两个索引作为参数,分别表示待排序数组和排序范围的起始和结束位置。partition方法负责划分数组,找到基准值的最终位置并将小于基准值的元素移到基准值的左侧。接着,通过递归调用quickSort方法,分别对基准值左右两侧的子数组进行排序。主方法中初始化了一个测试数组并对其实行快速排序,最后输出排序后的数组。


上一篇: 插入排序算法
下一篇: 希尔排序算法
推荐文章
  • MD5(Message-DigestAlgorithm5)是一种广泛使用的散列函数(哈希函数),由美国密码学家罗纳德·李维斯特(RonaldL.Rivest)在1991年设计。MD5的作用是对任意长度的信息生成一个固定长度(128位,即32个十六进制字符)的“指纹”或“消息摘要”,并且几乎不可能找到
  • 循环冗余校验(CyclicRedundancyCheck,CRC)是一种用于检测数据传输和存储过程中发生错误的技术,属于一种基于数学原理的错误检测编码(ErrorDetectionCoding)方法。它通过在原始数据上附加一个固定长度的校验码,使得接收端可以通过同样的计算规则对收到的数据进行校验,确
  • AES(AdvancedEncryptionStandard)是一种广泛使用的对称密钥加密算法,它是美国国家标准与技术研究院(NIST)于2001年制定的加密标准,用于替代原有的DES(DataEncryptionStandard)。AES算法以其高效性、安全性和可靠性而著称,在众多应用领域中被广泛
  • RSA(Rivest-Shamir-Adleman)是一种广泛应用的非对称加密算法,由RonRivest、AdiShamir和LenAdleman在1977年提出。其安全性基于数学上的大数因子分解难题,即对于足够大的两个素数p和q而言,已知它们的乘积很容易,但想要从这个乘积中恢复原始的素数则异常困难
  • 最小生成树(MinimumSpanningTree,MST)是一种图论算法,用于在一个带权重的无向连通图中找到一棵包括所有顶点且总权重尽可能小的树。常见的最小生成树算法有两种:Prim算法和Kruskal算法。Prim算法原理:Prim算法是一种贪心算法,它从图中的一个顶点开始,逐步增加边,每次都添
  • 关于最短路径算法的Java实现,这里简述一下几种常用的算法及其基本原理,并给出一个Dijkstra算法的基本实现框架。Dijkstra算法(适用于无负权边的图)Dijkstra算法用于寻找图中一个顶点到其他所有顶点的最短路径。它维护了一个距离表,用来存储从源点到各个顶点的已知最短距离,并且每次都会选
学习大纲