算法题:对只含有0,1,2三个元素的数组排序,时间复杂度O(n)

2024-08-24 00:38

本文主要是介绍算法题:对只含有0,1,2三个元素的数组排序,时间复杂度O(n),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

将元素均为0、1、2的数组排序,时间复杂度O(n)。

思路:

方法1:通过三个下标遍历一遍实现的方法。

p1从左侧开始,指向第一个非1的数字;p3从右侧开始,指向第一个非3的数字。

p2从p1开始遍历,如果是2,p2继续遍历,直到p2遇到1或者3

如果遇到1,则和p1进行交换,然后p1向右,指向第一个非1的数字

如果遇到3,则和p3进行交换,然后p3向左,指向第一个非3的数字

方法2:基于快排划分的思路

上面的思路,是针对三个数的,如果有更多的数,怎么处理呢?比如,4个,5个等等。下面根据快速的排序的启发,介绍一种算法,尽管在处理三个数的时候,比较次数会多些,但具有很好的通用性。

思路来自快排的划分部分,快排的划分部分:给定pivot,然后将数据划分为<=pivot和>pivot两部分。这样,三个数字时,需要两次划分:

1.第一次,用1作为pivot,划分1到最左边;

2.第二次,用2作为pivot,划分2到左边,则得到整体的排序。

方法1的代码:

void sort012(vector<int> array)
{int p0=0;int p2=array.size()-1;int p1;//p0指向第一个不是0的值while(array[p0]==0 && p0<array.size()){p0++;}//p2指向第一个不是2的值while(array[p2]==2 && p2>=0){p2--;}p1=p0;//p1从p0的位置开始遍历while(p1<=p2){if(array[p1]==1)p1++;else if(array[p1]==0){swap(array[p0],array[p1]);	while(array[p0]==0 && p0<array.size()){p0++;}}else{swap(array[p2],array[p1]);while(array[p2]==2 && p2>=0){p2--;}}}
}

 

这篇关于算法题:对只含有0,1,2三个元素的数组排序,时间复杂度O(n)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100952

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

MySQL中DATE_FORMAT时间函数的使用小结

《MySQL中DATE_FORMAT时间函数的使用小结》本文主要介绍了MySQL中DATE_FORMAT时间函数的使用小结,用于格式化日期/时间字段,可提取年月、统计月份数据、精确到天,对大家的学习或... 目录前言DATE_FORMAT时间函数总结前言mysql可以使用DATE_FORMAT获取日期字段

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于