对 0、1 和 2 的数组进行排序2025年3月17日 | 阅读 21 分钟 数组是一种线性数据结构,包含存储在连续内存位置的元素。它主要存储相同数据类型的元素。这些连续内存位置之间的差异取决于我们使用的数据类型,例如 **int、float、double、char、long** 等。位于连续内存位置的元素使我们能够轻松地跟踪元素。与链表、队列、堆栈等其他数据结构以及树和图等非线性数据结构相比,它还降低了搜索元素的复杂度。 可以轻松选择数组的基索引。通常,允许 n 索引的编程语言也允许负索引值,而其他标量数据类型,如枚举或字符,可用作数组索引。数组包含索引,从 0 开始,一直到数组大小减一。如果我们有一个包含 12 个元素的数组,那么数组的索引将从 0 开始,一直到索引号 11。 排序数组意味着数组中的元素必须以特定顺序存在,无论是升序还是降序。例如,如果我们有一个包含 5 个元素的数组,如下所示:4、2、3、10、5。现在,如果我希望这个数组被排序,它将默认按升序排列,结果将是 - 2、3、4、5、10。我们将使用各种排序方法来对数组元素进行排序,例如 **冒泡排序、插入排序、快速排序和归并排序**。在这些复杂度中,快速排序和归并排序在排序方法中起着非常重要的作用。 什么是包含 0、1 和 2 的数组?正如我们已经看到的,数组是一种线性数据结构,包含存储在连续内存位置的相同数据类型的数据。在这里,在包含 0、1 和 2 的数组中,我们将仅以 0、1 和 2 的形式存储数据。例如,一个包含 11 个元素的数组,这些元素如下 - 0、1、1、2、2、1、0、2、1、0、0。 如果我们谈论排序包含 0、1 和 2 形式元素的数组,则意味着 **排列数组中的元素** 按升序或降序。在这里,我们将升序视为默认情况。让我们看一个包含 10 个元素的数组,该数组包含 0、1 和 2 形式的元素。 我们需要执行的主要任务是排序数组,以便所有 0 都排在所有 1 之前,所有 1 都排在所有 2 之前,最后,所有 2 将填充剩余的数组。 A = { 0, 1, 2, 2, 0, 1, 0, 2, 1, 0 } 数组 **A 的排序版本 = { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2 }** B = { 0, 1, 2, 1, 0, 1, 0, 2, 1, 0 } 数组 **B 的排序版本 = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2 }** 排序包含 0、1 和 2 的数组的方法 -
让我们开始使用这些方法对数组进行排序 - 方法 # 1 - 使用双重遍历的蛮力法使用此方法,我们需要对包含 0、1 和 2 的数组进行升序排序。但是,这取决于程序员是想对数组进行升序还是降序排序;我们将按默认情况,即升序进行排序。 ![]() 我们将为 ' n ' 个元素推导出算法,但我们将取一个随机数组并对其进行实验,以基本理解概念。 A = { 0, 1, 0, 2, 1, 1, 0, 2, 2, 0, 1 } 程序步骤 -
使用计数方法(即方法 # 1)将包含 0、1 和 2 形式元素的数组按升序排序的算法。 步骤 1 - 考虑一个包含 n 个元素的数组,所有元素都以 0、1 和 2 的形式存在。 步骤 2 - 构建一个排序 0、1 和 2 数组的函数。 步骤 3 - 从主函数将数组和元素的总数作为参数传递给排序函数。 步骤 4 - 在排序函数中,声明三个变量,分别命名为 zero_count、one_count 和 two_count。 步骤 5 - 变量 zero_count 存储从主函数作为参数传递的数组中所有零的数量。 步骤 6 - 变量 one_count 存储从主函数作为参数传递的数组中所有一的数量。 步骤 7 - 变量 two_count 存储从主函数作为参数传递的数组中所有二的数量。 步骤 8 - 在计算完数组中的所有 0、1 和 2 之后,将所有值重新插入到给定的主数组中,因为我们需要对数组进行排序。 步骤 9 - 最初,将所有零放回传递给主函数中作为参数的数组。 步骤 10 - 在从连续索引号处放置所有零之后,将所有一放回数组。 步骤 11 - 类似地,最后,将所有二放回数组的剩余索引处。 步骤 12 - 最后,在主函数中,打印排序后的数组。 现在,让我们在 C、C++ 和 Python 中执行上述方法 1,即蛮力双重遍历法。 使用方法 1 在 C 编程语言中排序包含 0、1、2 的数组的程序 -使用方法 # 1 对包含 0、1、2 的数组进行排序的 C 程序输出 ![]() 使用方法 1 在 C++ 编程语言中排序包含 0、1、2 的数组的程序 -使用方法 # 1 对包含 0、1、2 的数组进行排序的 C++ 程序输出 ![]() 使用方法 1 在 Python 编程语言中排序包含 0、1、2 的数组的程序 -使用方法 # 1 对包含 0、1、2 的数组进行排序的 Python 程序输出 ![]() 使用方法 1 在 Java 编程语言中排序包含 0、1、2 的数组的程序 -使用方法 # 1 对包含 0、1、2 的数组进行排序的 JAVA 程序输出 ![]() 在特定编程语言中成功执行程序并遵循使用双重遍历方法的蛮力算法后,我们将获得正确的结果,即 **将数组升序排序**。 现在,让我们分析我们应用以将数组升序排序的算法的运行时间和性能,方法是找出算法的时间复杂度和空间复杂度,即方法 # 1。 方法 # 1 的时间复杂度 - 为了找到时间复杂度,我们需要观察算法并分析执行特定行所需的时间。我们可以观察到,我们需要遍历数组两次;一次遍历用于计算 0、1 和 2 的数量。计数后,第二次遍历用于将排序后的值复制回数组,为此,我们需要复制 n 个元素。因此,时间复杂度将是 - T ( n ) = O ( n ) + O ( n ) T ( n ) = O ( n ) 因此,时间复杂度将为 O ( n ),因为我们给出了一个渐进的粗略想法,即我们需要 ' n ' 时间来解决 ' n ' 个元素的问题。 方法 # 1 的空间复杂度 - 为了找到空间复杂度,我们需要观察程序并分析存储所有变量所需的空间。当我们注意到程序时,我们会发现不需要额外的空间来存储元素。 S ( n ) = O ( 1 ) 因此,上述方法 # 1 的空间复杂度将是常数。 方法 # 2 - 使用单次遍历进行三向分区优化方法使用此方法,我们需要对包含 0、1 和 2 的数组进行升序排序;但是,这取决于程序员是想将数组升序还是降序排序;在这里,我们将按默认情况,即升序进行排序。 首先,每个程序员脑海中都会想到方法 1 的方法,我们将先遍历数组,然后在一个遍历中计算数组中给定的元素有多少个 0、1 和 2。我们将再次遍历数组,并将元素按顺序复制到数组中。最后,正如我们上面已经看到的,我们需要对给定数组进行两次遍历才能对数组元素进行排序。 ![]() 在此三向分区方法中,我们只需要遍历一次,并且在遍历过程中,我们将整个数组按升序排序。此方法将使用三个指针将数组划分为四个部分,即 **low、mid** 和 **high**。 这四个指针如下 -
在对每个区域进行分区之前,请考虑一点,即分区是基于特定标准进行的,即,让我们以区域 1 为例;在区域 1 中,我们需要将数组划分为一个区域,该区域从索引 0 开始,到 low - 1 结束。我们可以定义它的范围为 - **[ 0, low )**,这意味着我们不包括索引 **' low '** 在 **区域 1** 中。 类似地,在 **区域 2** 中,我们可以将范围定义为从 low 到 mid - 1,即 **[ low, mid )**,这意味着我们不能包含数字 **' mid '** 的索引。 同样,我们有 **区域 3** 的范围,即 **[ mid, high )**,这意味着我们不能包含数字 **' high '** 的索引。 最后,我们可以定义最后一个 **区域 4** 的范围,即 **[ high, n )**,这意味着我们不能包含数字 **' n '** 的索引。 我们将为 ' n ' 个元素推导出算法,但我们将取一个随机数组并对其进行实验,以基本理解概念。 A = { 0, 1, 0, 2, 1, 1, 0, 2, 2, 0, 1 } 程序步骤 -
使用方法 2(即方法 # 2)将包含 0、1 和 2 形式元素的数组按升序排序的算法。 步骤 1 - 考虑一个包含 n 个元素的数组,所有元素都以 0、1 和 2 的形式存在。 步骤 2 - 构建一个排序 0、1 和 2 数组的函数。 步骤 3 - 从主函数将数组和元素的总数作为参数传递给排序函数。 步骤 4 - 在排序函数中,声明三个变量,分别命名为 low、mid 和 high。 步骤 5 - 将这些变量初始化为 low = 0、mid = 0 和 high = n - 1。 步骤 6 - 运行循环直到 mid <= high。 步骤 7 - 如果 A [ mid ] == 0,那么我们将索引 low 处的元素与索引 mid 处的元素交换,然后将 low 递增 1,即 low = low + 1,并将 mid 递增 1,即 mid = mid + 1。 步骤 8 - 继续。 步骤 9 - 如果 A [ mid ] == 1,那么我们将 mid 递增 1,即 mid = mid + 1。 步骤 10 - 继续 步骤 11 - 如果 A [ mid ] == 2,我们交换索引 mid 处的元素与索引 high 处的元素,然后将 high 递减 1,即 high = high - 1。 步骤 12 - 继续。 步骤 13 - 最后,在主函数中打印排序后的数组。 现在,让我们在 C、C++ 和 Python 中执行上述方法 1,即蛮力双重遍历法。 使用方法 2 在 C 编程语言中排序包含 0、1、2 的数组的程序 -使用方法 # 2 对包含 0、1、2 的数组进行排序的 C 程序输出 ![]() 使用方法 2 在 C++ 编程语言中排序包含 0、1、2 的数组的程序 -使用方法 # 2 对包含 0、1、2 的数组进行排序的 C++ 程序输出 ![]() 使用方法 1 在 Python 编程语言中排序包含 0、1、2 的数组的程序 -使用方法 # 2 对包含 0、1、2 的数组进行排序的 Python 程序输出 ![]() 使用方法 2 在 Java 编程语言中排序包含 0、1、2 的数组的程序 -使用方法 # 2 对包含 0、1、2 的数组进行排序的 JAVA 程序输出 ![]() 在特定编程语言中成功执行程序并遵循使用单次遍历方法的三向分区优化算法后,我们将获得正确的结果,即按升序排序数组。 现在,让我们分析我们应用以将数组升序排序的算法的运行时间和性能,方法是找出算法的时间复杂度和空间复杂度,即方法 # 1。 方法 # 2 的时间复杂度 - 为了找到时间复杂度,我们需要观察算法并分析执行特定行所需的时间。我们可以观察到,我们需要仅遍历一次数组,以将 mid 索引处的值与 0、1 和 2 进行比较。我们将根据上述条件应用必要的运算。遍历完成后,我们将得到排序后的数组作为结果。因此,时间复杂度将是 - T ( n ) = C + O ( n ) T ( n ) = O ( n ) 这里 ' C ' 是交换和将值赋给变量所需的任何常数时间。 因此,时间复杂度将是 O ( n ),因为我们进行渐近的粗略估计,即我们需要 ' n ' 时间来解决 ' n ' 个元素的问题。 方法 # 2 的空间复杂度 - 为了找出空间复杂度,我们需要观察程序并分析存储所有变量所需的空间;当我们注意到程序时,我们将观察到不需要额外的空间来存储元素。 S ( n ) = O ( 1 ) 因此,上述方法 # 2 的空间复杂度将是常数。 下一主题股票跨度问题 |
我们请求您订阅我们的新闻通讯以获取最新更新。