算法题:对只含有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

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不