视频源连接

选择排序

思路:

  1. 从数组索引0开始,找比当前值更小的值,找到即为最小值
  2. 找到最小值后交换当前索引值以及最小值所在索引值
  3. 重复遍历
    源代码:
    image.png

冒泡排序

思路:

  1. 从数组索引0开始,只要当前值比他下一位值大,交换两者顺序。
  2. 重复遍历
    源代码:
    image.png

位运算

  1. a ^ b 相同为0 不同为1
  2. 位运算满足交换律和结合律 即: a^b = b^a; (a^b)^c = a^(b^c)
  3. 0 ^ N = N; N^N = 0;
  4. 位运算可以理解为二进制的不进位相加
    比如: 101 ^ 011 = 110;通过这个,可以进一步理解为什么满足交换律 因为无论多少个数字异或,那么相同位置上是1 还是0 完全取决于1 和0的数量,与顺序无关

所以反过来看冒泡排序中的swap,原理如下:
image.png

但值得注意的是,其中i和j不能是相同值,相同值相当于自己和自己异或 那么会清0 导致计算结果不准确。

  1. 提取一个数最右的1:int rightOne = eor & (~eor +1);原理如下:
    image.png 思路:自己与自己取反加1;

原题:数组中有两个数是奇数个,其余数为偶数个,找出这两个数:
image.png

插入排序

思路:

  1. 从数组索引1开始,向前比较找到合适的位置插入

源代码:
image.png

相较于选择和冒泡,插入排序最差是On^2 最好是On 根据数据情况来定,相对性能较好

二分法

常见问题:

  1. 有序数组 找某个数是否存在
  2. 有序数组 找大于某个数最左侧的位置
  3. 搜索插入位置
  4. 局部最小值
    一个arr中 任意两个元素相邻数一定不相等,找任意一个局部最小值,局部最小为i 比i-1, 比i+1 都小。要求时间复杂度好于On 最好用二分

思路:
image.png
解释:首先判断0 和 n是不是局部最小 不是的话那么0-1 一定是大小向下的趋势,n到n-1一定是向下的。那么1到n-1之间一定有个最小值。
所以这个时候你找m 如果不是的话m到m-1之间一定是向下的那么m-1到1之间一定存在最小值

生成0-n的随机数

Math.random() => [0 - 1) 所有的小数
Math.random() * N => [0, N) 所有小数
parseInt(Math.random () *N)=> [0, N-1]所有整数 等概率返回
解决实际问题的思路:1.数据特殊可以优化,2问题特殊可以优化

贾东雷
133 声望7 粉丝

坚持原著,深度思考,一名前前前后端工程师