美文网首页数据结构与算法
对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于

对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于

作者: 奕玄 | 来源:发表于2019-03-11 21:43 被阅读0次

问题描述:假设某个数组中只有数字 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]

相关文章

  • 对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于

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

  • OC数组大小排序算法

    1、要排序的数组如下,数字里面是字典,字典有两对键值对,数组需要按照字典里temp大小进行排序。 2、排序算法如下...

  • 记JavaScript中的一些小坑

    1. 数字数组排序 JavaScript中的sort()默认是字母排序的,例如[1,2,10,5].sort() ...

  • 数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数。 示例: 思路 1.排序数组中,相同的数字时连在一起的。2.进行两次...

  • 顺序表

    1.删除排序数组中的重复数字 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的...

  • 剑指Offer Java版 面试题53:在排序数组中查找数字

    题目一:数字在排序数组中出现的次数。统计一个数字在排序数组中出现的次数。例如,输入排序数组{1, 2, 3, 3,...

  • Leetcode 16

    在数组中找到三个数字使得其和与给定的target最接近。 1.将数组排序2.使用两层循环,外层循环遍历first,...

  • 53:数字在排序数组中出现的次数

    题目53:数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数。 举例说明 例如输入排序数组{ 1, 2...

  • js 排序

    1.快速排序1(纯数字数组) 2.快速排序2(对象数组) 注意:这地方有个坑,只会调换排序的属性,其他属性不变。比如:

  • 腾讯模拟笔试-

    题目: 在排序数组中,找出给定数字的出现次数.比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。 输入:...

网友评论

    本文标题:对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于

    本文链接:https://www.haomeiwen.com/subject/ohvipqtx.html