Java 中的快速排序2025 年 5 月 17 日 | 阅读 7 分钟 快速排序是一种利用分治技术的排序算法。它选择一个基准元素,并将其放在已排序数组的适当位置。 分治是一种将算法分解为子问题,然后解决子问题,最后将结果组合起来以解决原始问题的技术。
快速排序的步骤步骤 1:选择基准元素。通常,选择第一个、最后一个或中间元素作为基准元素。 步骤 2:进行数组划分。为此,围绕基准元素重新排列数组中的元素。划分后,基准元素左侧的元素(左子数组)小于基准元素,基准元素右侧的元素(右子数组)大于基准元素。 步骤 3:对左子数组和右子数组重复上述步骤。这可以通过递归完成。当子数组只剩一个元素时,递归停止。因为单个元素已经排序。 算法快速排序算法的工作原理实现快速排序的简单步骤如下。 步骤 1:选择基准元素。通常,选择第一个、最后一个或中间元素作为基准元素。在本例中,我们取最后一个元素作为基准。另外,取两个指针 j 和 k,其中 j 的值为 -1,k 指向数组的第 0 个索引。移动 j 指针,使得 j 指针指向的元素以及 j 指针左侧的元素都小于基准元素。 ![]() 步骤 2:将 a[k](值为 19)与基准元素进行比较。我们看到 a[k] > 基准元素。因此,将 k 增加 1。现在,k 指向第 1 个索引。 ![]() 步骤 3:将 a[k](值为 4)与基准元素进行比较。我们看到 a[k] < 基准元素。因此,将 j 增加 1。现在,j 指向第 0 个索引。 ![]() 步骤 4:交换 a[j] 和 a[k],并将 k 增加 1。现在,k 指向第 2 个索引。 ![]() 步骤 5:将 a[k](值为 13)与基准元素进行比较。我们看到 a[k] < 基准元素。因此,将 j 增加 1。现在,j 指向第 1 个索引。 ![]() 步骤 6:交换 a[j] 和 a[k],并将 k 增加 1。现在,k 指向第 3 个索引。 ![]() 步骤 7:将 a[k](值为 18)与基准元素进行比较。我们看到 a[k] > 基准元素。因此,将 k 增加 1。现在,k 指向第 4 个索引。 ![]() 步骤 8:将 a[k](值为 10)与基准元素进行比较。我们看到 a[k] < 基准元素。因此,将 j 增加 1。现在,j 指向第 2 个索引。 ![]() 步骤 9:交换 a[j] 和 a[k],并将 k 增加 1。现在,k 指向第 5 个索引。 ![]() 步骤 10:将 a[k](值为 10)与基准元素进行比较。我们看到 a[k] < 基准元素。因此,将 j 增加 1。现在,j 指向第 3 个索引。 ![]() 步骤 11:交换 a[j] 和 a[k],并将 k 增加 1。现在,k 指向第 6 个索引。 ![]() 步骤 12:将 a[k](值为 15)与基准元素进行比较。我们看到 a[k] < 基准元素。因此,将 j 增加 1。现在,j 指向第 4 个索引。 ![]() 步骤 13:交换 a[j] 和 a[k]。由于 k 指向最后一个元素,因此进一步的检查和交换在此停止。请注意,j 索引左侧的所有元素以及 j 索引处的元素都小于基准元素。 ![]() 步骤 14:将 a[j + 1] 与基准元素交换(交换 18 和 17)。 ![]() 我们看到基准元素已放置在已排序数组的正确位置。 ![]() 步骤 15:根据基准元素将数组划分为左子数组和右子数组。位于基准元素左侧的元素属于左子数组,位于基准元素右侧的元素属于右子数组。 ![]() 步骤 16:对左子数组和右子数组重复所有步骤。 Java 中快速排序的实现让我们来看一下 Java 中的快速排序程序。 示例编译并运行输出 The array before sorting is: 10 7 8 9 1 5 The array after sorting is: 1 5 7 8 9 10 时间复杂度:程序的 O(n log n)。这是因为基准元素将数组分成两个相等的部分。 空间复杂度:平均情况下,对于递归栈,程序的空间复杂度为 O(log n);在最坏情况下,由于深度递归,空间复杂度为 O(n)。 快速排序的优点
快速排序的缺点
结论由于其速度和简单性,快速排序是最广泛使用和最高效的排序算法之一。其原地排序能力与分治方法的结合,使其适用于内存受限的系统和大型数据集。 下一主题Java 中的二叉树的层序遍历 |
螺旋式遍历矩阵是指以圆形模式遍历元素,从左上角开始,沿着顶行向右移动。在每次行或列遍历之后,调整边界,并切换方向,持续进行,直到所有元素...
阅读 10 分钟
如果一个数能被1和它本身整除,那么它就是素数。换句话说,素数是只有两个不同自然数因子1和它本身的自然数。例如,2、3、5、7、11等都是素数。请注意……
5 分钟阅读
文本处理中的一个典型问题是字数统计。Java 多线程可以通过将任务分解成更小的部分并同时处理它们来极大地加快处理速度。在本节中,我们将讨论使用 Java 多线程进行字数统计的不同方法。使用……
阅读 8 分钟
Shunting-yard 算法是计算机科学中一种常用的算法,用于将中缀表达式转换为后缀或前缀表达式。在后缀表示法(也称为逆波兰表示法,RPN)中,运算符放在操作数之后,而在前缀表示法(也称为波兰表示法….
阅读 8 分钟
在 Java 编程的世界里,开发人员经常会遇到需要确定线程状态的情况。了解线程是处于活动状态还是已完成执行,对于高效的线程管理至关重要。在这种情况下,isAlive() 方法就会出现……
阅读 4 分钟
约瑟夫问题是一个关于特定淘汰游戏理论问题。它以犹太历史学家 Flavius Josephus 的名字命名,他根据传说,创造了这种方法来逃避在围攻期间被俘。问题陈述 n 个人站成一个圆圈,...
阅读 10 分钟
Java 8 提供了一个名为方法引用的新功能。方法引用是指函数式接口的一个方法。它是 Lambda 表达式的一种简洁易懂的形式。当我们使用 Lambda 表达式引用方法时,我们可以用它替换……
阅读 8 分钟
Java 程序可以使用简单的文本编辑器编写。但是,使用 Java 集成开发环境 (IDE) 可以帮助开发人员更有效地开发软件。IDE 提供了许多功能,如自动完成、调试器选项等。在本节中,我们将讨论一些广泛使用的 Java...
阅读 3 分钟
在 Java 中,**继承 (inheritance)** 是最重要的 OOP 概念,它允许将一个类的属性继承到另一个类中。通常,它定义了一个 IS-A 关系。通过使用继承特性,我们可以从现有类派生出一个新类。Java 支持以下四种类型……
7 分钟阅读
在本节中,我们将学习自守数及其示例,并创建 Java 程序来检查数字是否为自守数。什么是自守数?如果一个数字的平方以该数字本身结尾,则称该数字为自守数。
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India