问题描述:假设某个数组中只有数字 1 和 2,进行排序,使得数字 1 位于数组前部分,数字 2 位于后部分。

这道算法题其实不是很难,使用各种排序算法应该都能解出,但是若要考虑性能问题,那就得选择一种算法复杂度最低的解法。这里我使用双指针的方法来解答该题,时间复杂度为 O(n)

  1. 解法步骤

(1)设置一个头指针、一个尾指针,头指针首先指向数组的第一个元素(索引为 0),而尾指针则指向数组的最后一个元素(索引为 len - 1,假定数组的长度为 len);

(2)然后比较这两个一前一后元素的大小;

  • 若两值不相等,则较小的 1 放在前面,较大的 2 放在后面,头指针往后移动一步,尾指针向前移动一步;
  • 若两值相等且都等于 1,则头指针往后移动一步,尾指针不移动;
  • 若两值相等且都等于 2,则尾指针往前移动一步,头指针不移动;

(3)接着再次比较头、尾指针指向元素的大小,决定是否交换值以及移动指针;

(4)依照以上步骤进行指针移动、元素大小比较,便可使得数字 1 位于数组前部分,数字 2 位于数组后部分。

  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 分别位于前、后部分相关推荐

  1. 将字符数组中的字符按从小到大的顺序排序

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p143 7.1.2 上级实训内容 [实训内容10]编写一个函数,要求用字符数组名作为参数,函数功能是将 ...

  2. JS 中对数组按照数组中某个对象的属性值进行排序

    最近遇到了按照数组中某个对象的属性值进行排序的需求,找了很多种方式,下面这个完美解决: arr是数组名,attr是数组某个对象的属性 完美解决~~ 转载于:https://www.cnblogs.co ...

  3. 根据数组中的某个键值大小进行排序,仅支持二维数组

    /**     * 根据数组中的某个键值大小进行排序,仅支持二维数组     *     * @param array $array 排序数组     * @param string $key 键值 ...

  4. 100题_10 在排序数组中查找和为给定值的两个数字

    题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1.2 ...

  5. 数据结构与算法--有序数组中找出和为s的两个数字

    有序数组中找和为s的两个数字 题目:输入一个递增排序的数组array, 和一个数字s, 在数组中找出两个数,使得这两个数的和是s,如果有多对,输出一对即可. 最简单方案 双循环,每次获取一个数据,和数 ...

  6. LeetCode 79单词搜索80删除排序数组中的重复项Ⅱ81.搜索旋转排序数组Ⅱ

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  7. iOS 根据数组中的字典的value值进行排序

    NSMutableArray *resArr = [NSMutableArray array];// 先把所有值的装进一个数组中NSMutableArray *valArr = [NSMutableA ...

  8. java删除有序数组中的重复元素_java去除已排序数组中的重复元素

    题目描述 给定一个已排序的数组,去除数组中的重复元素,只保留一个重复的元素,并且返回新的数组长度. 要求: 不要给数组分配额外的空间,你必须使用常量的内存大小进行原地操作. 例如: 给出数组A=[1, ...

  9. vue删除数组中的一条数据_删除排序数组中的重复项 II

    删除排序数组中的重复项 II题目 给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改 ...

  10. LeetCode 1985. 找出数组中的第 K 大整数(排序)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串数组 nums 和一个整数 k . nums 中的每个字符串都表示一个不含前导零的整数. 返回 nums 中表示第 k 大整数的字符串. 注 ...

最新文章

  1. docker加速器,设置cdn
  2. Linux 下的动态链接库问题
  3. android开发地址选择器,Android地址选择器 类似于京东的地址选择
  4. EOS Dawn 1.0
  5. apt-get卸载命令
  6. 从程序媛到微软全球 AKS 女掌门人,技术女神驾到!
  7. UNREAL ENGINE 4.13 正式发布!
  8. MySQL5.5安装版安装教程
  9. Android布局之屏幕自适应
  10. TP5 Validate 验证
  11. IDEA 2020.3 更新了,机器学习都整上了
  12. R语言学习笔记(三)
  13. matlab中计算sinad,FFT频谱测试法Matlab代码
  14. 关于Android的ImageView置顶
  15. 设计模式 — 工厂模式
  16. 微信支付-同一个订单多次请求(生成二维码)方案
  17. python最小二乘法_最小二乘法(least sqaure method)
  18. win11系统中如何把任务栏图标变小的方法
  19. 喜报接连,闪马智能与创始人兼CEO彭垚斩获猎云网、雷锋网多项奖项
  20. BIRT 使用说明书

热门文章

  1. 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍
  2. 啊里大鱼短信发送API
  3. BZOJ1747 [Usaco2005 open]Expedition 探险
  4. 剑指offer--3题
  5. 基础数据结构【一】————数组
  6. PHP 函数 ignore_user_abort定时执行任务的实现
  7. linux的strace命令
  8. 在ASP.NET中自动给URL地址加上超链接
  9. ASP.NET中的事务处理和异常处理
  10. 在asp.net(C#)中怎么获得一个目录的大小?