Java 中的荷兰国旗问题 | Java 程序对 0、1 和 2 的数组进行排序2025 年 3 月 23 日 | 阅读 5 分钟 荷兰国旗 (DNF) 问题是由著名的荷兰计算机科学家 Edsger Dijkstra 提出的一个最受欢迎的编程问题。顾名思义,它基于荷兰国旗,包含三种颜色,即红、白、蓝。任务是随机排列红、白、蓝三种颜色的球,以便相同颜色的球放在一起。 ![]() 我们将使用数组来解决上述问题。在这里,我们不使用颜色,而是使用 0、1 和 2,分别代表红色、白色和蓝色。为了匹配球的颜色,我们将对数组进行排序。 例如,考虑以下数组。 输入:{0, 1, 2, 2, 1, 0, 0, 2, 0, 1, 1, 0} 输出:{0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2} 因此,荷兰国旗问题与对 0、1 和 2 的数组进行排序相同。在本节中,我们将为此创建一个 Java 程序。 问题解决方案有许多解决方案可用,它们在性能和特性上可能有所不同。 朴素方法简单的解决方案是对数组执行计数排序。在这种排序中,我们计算元素(0、1 和 2)的频率,然后将它们按正确的顺序放置。该方法的缺点是它会遍历数组两次,一次用于排序,一次用于将元素按正确的顺序放置。 为了克服上述缺点,我们重新组织数组,以便在一次遍历中解决问题。它使用一种替代的线性时间分区例程(与三路分区相同),该例程将值分成以下三组。
算法让我们通过一个例子来理解。 示例在以下示例中,我们使用了三个变量 low、mid 和 high。low 和 mid 指针指向数组的开头,high 指针指向数组的末尾。有三种情况:
考虑以下数组。 ![]() 最初,low 和 mid 指向数组的开头,即 0,high 指向数组的末尾,即 2。 ![]() 步骤 1:检查 array[mid]=0,将 array[mid] 与 array[low] 交换,并将两个指针都加 1。 ![]() 步骤 2:检查 array[mid]=1,无需交换。将 mid 指针加 1。 ![]() 步骤 3:检查 array[mid]=0, 将 array[mid] 与 array[low] 交换,并将两个指针都加 1。 ![]() 步骤 4:检查 array[mid]=2,将 array[mid] 与 array[high] 交换,并将 high 指针减 1。 ![]() 步骤 5:检查 array[mid]=1,无需交换,将指针加 1。 ![]() 步骤 6:检查 array[mid]=0, 将 array[mid] 与 array[low] 交换,并将两个指针都加 1。 ![]() 步骤 7:检查 array[mid]=2,将 array[mid] 与 array[high] 交换,并将 high 指针减 1。 ![]() 我们观察到数组已排序。 让我们用不同的逻辑在 Java 程序中实现上述方法。 荷兰国旗问题 Java 程序DutchNationalFlag.java 输出 [0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2] 让我们看看相同的另一个逻辑。 DutchFlagProblem.java 输出 Array before Sorting: 0 0 1 2 0 1 2 Array after sorting: 0 0 0 1 1 2 2 上述程序在不使用额外空间的情况下在线性时间内对数组进行排序。数组仅遍历一次。因此,该算法的时间复杂度为 O(n),其中 n 是数组的大小。 下一个主题Java 计算列表的平均值 |
? Java 是一种强大的编程语言,它提供了许多有效的方法来处理和使用数组。将数组传递给函数是数组操作的关键部分。程序员可以通过将数组作为函数参数来执行操作,直接操作数组项。在此...
阅读 8 分钟
在本节中,我们将学习 Java 中二叉树的右视图以及实现它的不同方法。在二叉树的右视图中,我们只打印当二叉树...时可见的节点。
阅读 4 分钟
要深入了解一种编程语言,应该练习具体的编程语言程序。通过实际操作程序,您将更好地学习和理解编程语言,并且在实践中实现时永远不会忘记这些概念。特别是如果您是初学者,那么...
阅读 8 分钟
在 Java 中,Vaadin 框架是一个用于开发 Web 应用程序的开源框架。由于它同时支持 JavaScript 和 AJAX,因此我们可以使用它们。通过使用 Google Web Toolkit,我们可以将其包含外部功能。Vaadin 框架渲染丰富的...
5 分钟阅读
Java 提供了三种不同的 getInteger() 方法,可以根据其参数进行区分。它们是:Java Integer getInteger(String nm) 方法 Java Integer getInteger(String nm, int val) 方法 Java Integer getInteger(String nm, Integer val) 方法 1. Java Integer getInteger(String nm) 方法:getInteger(String nm) 方法是……
5 分钟阅读
图论中的一个重要问题是确定从一个顶点到另一个顶点的有向图的所有路径。它在路由、网络最优路径的决策制定以及一般情况下的多种用途中特别有用...
5 分钟阅读
? 在本节中,我们将学习为什么我们在 Java 中使用构造函数,构造函数的目的和必要性是什么。除此之外,我们还将看到构造函数的类型。在 Java 中,构造函数类似于方法。构造函数的属性...
阅读 3 分钟
Java protected 关键字 protected 关键字用作访问修饰符。它可以与变量、方法、构造函数和内部类一起使用。此修饰符提供了一个访问级别,允许在同一包内以及由子类(即使它们在不同的包中)访问...
阅读 6 分钟
克里希那穆提数是 Java 中的另一个特殊数字。如果一个数字的所有数字的阶乘之和等于该数字,则该数字称为克里希那穆提数。克里希那穆提数也称为强数。就像质数和阿姆斯特朗数一样,克里希那穆提数……
阅读 3 分钟
给定一个矩阵,我们的任务是检查该矩阵是否为对合矩阵。对合矩阵:如果一个矩阵与其自身相乘生成单位矩阵,则该矩阵称为对合矩阵。与其自身是其逆的矩阵称为对合矩阵。如果...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India