C++ 中围绕一个元素的三向分区2025年5月14日 | 阅读12分钟 在数组操作和排序问题中,当涉及到枢轴元素时,所使用的经典算法技巧是三路分区。其主要目标是根据指定的枢轴值重新排列数组,将其划分为三个不同的部分。
当我们要查找带有重复值的数组时,此方法通过额外的迭代可以更快地工作。我们在许多算法中使用它,例如快速排序或荷兰国旗问题,其中需要通过与枢轴或特定标准进行比较或根据枢轴或特定标准进行排序和重排。 用例三路分区解决了传统双路分区技术的一个常见限制,即双路分区仅将数组分为两部分:小于枢轴的元素和大于枢轴的元素。对于包含大量等于枢轴的元素的数组进行双路分区可能需要不必要的比较和交换,这使得整个分区效率低下。三路分区显式处理枢轴元素的方法可最大程度地减少这些冗余操作并提高性能。 该技术在以下问题中特别有益:
关键概念三路分区算法使用 low、mid 和 high 三个指针,在单次遍历中有效地分割数组。该技术根据枢轴元素将数组分为三个段:小于枢轴、等于枢轴或大于枢轴。Low 跟踪小于枢轴区域的边界,Mid 扫描正在测试的当前元素,High 标记大于枢轴的边界。 该算法是单次遍历,运行时间为 O(n),空间复杂度为 O(1),非常适合原地重排。它解决了荷兰国旗问题、快速排序的优化版本,并且在数组包含重复元素时表现出色。总而言之,三路分区是数组操作的强大工具,为许多应用中的系统性、直接排序提供了非常通用的手段。 方法 1:暴力方法暴力方法是三路分区的一种显而易见的方法,即多次遍历数组以根据枢轴对元素进行分类。其附加的空间要求和易于实现的特性使得此方法易于实现但效率不高。 最后一步是将三个段连接到一个新数组中。暴力方法确保正确分区,但存在需要额外内存(O(n) 空间复杂度)和需要多次遍历(O(n) 时间复杂度)的巨大缺点。 示例让我们以一个示例来说明使用暴力方法在 C++ 中围绕元素进行三路分区。 输出 Three-Way Partitioning (Brute Force Approach) Enter the elements of the array (space-separated integers): 2 3 7 45 6 23 43 68 94 57 Enter the pivot element: 43 Original array: 2 3 7 45 6 23 43 68 94 57 Elements less than pivot: 2 3 7 6 23 Elements equal to pivot: 43 Elements greater than pivot: 45 68 94 57 Partitioned array: 2 3 7 6 23 43 45 68 94 57 Partitioning Complete 说明输入处理
验证
分区逻辑 算法的主要部分是 threeWayPartitionBruteForce() 函数。它通过遍历数组三次来执行实际分区:
复杂度分析时间复杂度 在分区过程中对数组执行的操作数量决定了时间复杂度。
由于所有三次遍历都是独立的,因此总时间复杂度是这些单独遍历的总和。
空间复杂度 空间复杂度由存储分区段的附加空间决定。
方法 2:两次遍历原地分区两次遍历原地交换分区是围绕枢轴进行三路分区的另一种方法。虽然在运行时比荷兰国旗算法慢,但这种方法在空间方面比暴力方法更快,因为它只使用恒定的额外空间。 该方法在两次遍历数组中进行:
步骤:
避免使用两个或更多指针来访问数组元素。将枢轴元素与数组元素进行比较,如果小于数组元素,则将其与数组左侧的元素交换。
示例让我们以一个示例来说明使用两次遍历原地分区方法在 C++ 中围绕元素进行三路分区。 输出 Enter elements of the array (space-separated): 12 32 84 64 56 89 23 42 Enter the pivot element: 23 Partitioned array: 12 23 64 56 89 84 42 32 说明输入处理 此处,系统提示用户输入一个空格分隔的整数列表。它会验证输入是否非空且为有效整数。如果输入的数据无效,它会提示用户输入正确的数据。 枢轴验证 最后,程序收集数组并要求用户输入枢轴元素。它首先检查枢轴是否在数组中。如果找不到枢轴,它会继续进行,并发出警告。 分区逻辑 数组分两次遍历进行分区。
现在,向下分区以将枢轴元素置于小于和大于枢轴的元素之间,然后打印数组。 复杂度分析时间复杂度
空间复杂度
下一主题C++ 中的 Motzkin 数 |
在现代 C++ 中,有效的内存管理对于创建高性能应用程序至关重要。`std::uninitialized_value_construct` 就是这样一个函数,它能够构建未初始化内存中的对象。本文解释了 `std::uninitialized_value_construct`,说明了它的功能,并提供了一些有用的示例来演示如何使用它。C++ 标准库...
5 分钟阅读
引言 计算几何中的一个主要问题是最近点对问题:为平面上给定的点集指定最近的点。这个问题在现实生活中非常有用,例如,在空中交通管制中,这很重要...
阅读9分钟
在 C++ 编程领域,对于寻求传统数组的灵活动态替代方案的开发人员来说,vector 已变得不可或缺。作为标准模板库 (STL) 的一部分,vector 提供了动态重**大**和小和自动内存管理的灵活性,使其成为场景的理想选择……
11 分钟阅读
缩写YAML代表YAML Ain't Markup Language(YAML不是标记语言),通常用于数据序列化。它易于阅读和书写。与JSON或XML等其他格式不同,YAML更侧重于简洁性。因此,它用于配置文件、数据交换……
11 分钟阅读
引言 在数学中,某些特殊数字集之所以脱颖而出,是因为它们具有某些特性。这些细分中的一个子集是 Rhona 数,其特征是与它们的数字和和数字乘积以特定方式相关。本文旨在概述什么是...
阅读 13 分钟
概述是指将汇编语言语句合并到 C++ 代码中的能力。此功能对于需要显著性能增强或 C++ 命令无法直接提供的特定硬件操作非常有用。汇编代码用于提供更大的...
阅读 10 分钟
20 是 C++ 标准库的另一个强大扩展,以及如何转换和处理范围的改进。它是 Ranges 库的一部分,Ranges 库是一种新的方法,它专注于以最优雅和最富有表现力的方式操作元素序列。
阅读 4 分钟
? 枚举(通常称为 enums)是 C++ 的一个组成部分,它提供了一种定义命名整数常量的强大方法。虽然枚举增强了代码的可读性和可维护性,但在实际场景中,通常需要将这些枚举值转换为字符串。这种转换尤其重要,在以下情况下...
阅读 16 分钟
引言 "" 是一个著名的算法问题,涉及在遵守特定限制的情况下,确定朋友们可能配对进行各种活动的次数。在此问题中,我们给出一群朋友,并要求确定他们...
阅读 6 分钟
简介 本文的主要主题是 C++ 中的 std::exponential_distribution 类,它是标准库中用于生成指数分布随机数的相当有用的工具。当关注泊松过程中事件之间的时间时,这种分布很有应用价值……
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India