对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于前、后部分
问题描述:假设某个数组中只有数字 1 和 2,进行排序,使得数字 1 位于数组前部分,数字 2 位于后部分。
这道算法题其实不是很难,使用各种排序算法应该都能解出,但是若要考虑性能问题,那就得选择一种算法复杂度最低的解法。这里我使用双指针的方法来解答该题,时间复杂度为 O(n)
。
- 解法步骤
(1)设置一个头指针、一个尾指针,头指针首先指向数组的第一个元素(索引为 0),而尾指针则指向数组的最后一个元素(索引为 len - 1,假定数组的长度为 len);
(2)然后比较这两个一前一后元素的大小;
- 若两值不相等,则较小的 1 放在前面,较大的 2 放在后面,头指针往后移动一步,尾指针向前移动一步;
- 若两值相等且都等于 1,则头指针往后移动一步,尾指针不移动;
- 若两值相等且都等于 2,则尾指针往前移动一步,头指针不移动;
(3)接着再次比较头、尾指针指向元素的大小,决定是否交换值以及移动指针;
(4)依照以上步骤进行指针移动、元素大小比较,便可使得数字 1 位于数组前部分,数字 2 位于数组后部分。
注意点:上面循环进行操作的条件是头指针索引值小于尾指针索引值。
书写的代码如下:
function sortOneTwoInArr (arr) {var len = arr.length;var head = 0;var tail = len - 1;/* 遍历数组,对 1 和 2 进行排序 */while (head < tail) {// 若头、尾指针指向的元素大小相等则只移// 动一个指针,否则同时移动两个指针if (arr[head] === arr[tail]) {if (arr[head] === 1) {head++;} else if (arr[head] === 2) {tail--;}} else {if (arr[head] > arr[tail]) {[arr[head], arr[tail]] = [arr[tail], arr[head]];}head++;tail--;}}return arr;
}/* 测试用例 */
var arr1 = [];
var arr2 = [1];
var arr3 = [2];
var arr4 = [1, 2, 1, 2];
var arr5 = [1, 1, 2, 2];
var arr6 = [1, 2, 2, 1, 1];
var arr7 = [2, 2, 1, 1, 2];
console.log(sortOneTwoInArr(arr6)); // [1, 1, 1, 2, 2]
复制代码
转载于:https://juejin.im/post/5c8661266fb9a04a0b230106
对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于前、后部分相关推荐
- 将字符数组中的字符按从小到大的顺序排序
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p143 7.1.2 上级实训内容 [实训内容10]编写一个函数,要求用字符数组名作为参数,函数功能是将 ...
- JS 中对数组按照数组中某个对象的属性值进行排序
最近遇到了按照数组中某个对象的属性值进行排序的需求,找了很多种方式,下面这个完美解决: arr是数组名,attr是数组某个对象的属性 完美解决~~ 转载于:https://www.cnblogs.co ...
- 根据数组中的某个键值大小进行排序,仅支持二维数组
/** * 根据数组中的某个键值大小进行排序,仅支持二维数组 * * @param array $array 排序数组 * @param string $key 键值 ...
- 100题_10 在排序数组中查找和为给定值的两个数字
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1.2 ...
- 数据结构与算法--有序数组中找出和为s的两个数字
有序数组中找和为s的两个数字 题目:输入一个递增排序的数组array, 和一个数字s, 在数组中找出两个数,使得这两个数的和是s,如果有多对,输出一对即可. 最简单方案 双循环,每次获取一个数据,和数 ...
- LeetCode 79单词搜索80删除排序数组中的重复项Ⅱ81.搜索旋转排序数组Ⅱ
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...
- iOS 根据数组中的字典的value值进行排序
NSMutableArray *resArr = [NSMutableArray array];// 先把所有值的装进一个数组中NSMutableArray *valArr = [NSMutableA ...
- java删除有序数组中的重复元素_java去除已排序数组中的重复元素
题目描述 给定一个已排序的数组,去除数组中的重复元素,只保留一个重复的元素,并且返回新的数组长度. 要求: 不要给数组分配额外的空间,你必须使用常量的内存大小进行原地操作. 例如: 给出数组A=[1, ...
- vue删除数组中的一条数据_删除排序数组中的重复项 II
删除排序数组中的重复项 II题目 给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改 ...
- LeetCode 1985. 找出数组中的第 K 大整数(排序)
文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串数组 nums 和一个整数 k . nums 中的每个字符串都表示一个不含前导零的整数. 返回 nums 中表示第 k 大整数的字符串. 注 ...
最新文章
- docker加速器,设置cdn
- Linux 下的动态链接库问题
- android开发地址选择器,Android地址选择器 类似于京东的地址选择
- EOS Dawn 1.0
- apt-get卸载命令
- 从程序媛到微软全球 AKS 女掌门人,技术女神驾到!
- UNREAL ENGINE 4.13 正式发布!
- MySQL5.5安装版安装教程
- Android布局之屏幕自适应
- TP5 Validate 验证
- IDEA 2020.3 更新了,机器学习都整上了
- R语言学习笔记(三)
- matlab中计算sinad,FFT频谱测试法Matlab代码
- 关于Android的ImageView置顶
- 设计模式 — 工厂模式
- 微信支付-同一个订单多次请求(生成二维码)方案
- python最小二乘法_最小二乘法(least sqaure method)
- win11系统中如何把任务栏图标变小的方法
- 喜报接连,闪马智能与创始人兼CEO彭垚斩获猎云网、雷锋网多项奖项
- BIRT 使用说明书