视频源连贯
抉择排序
思路:
- 从数组索引0开始,找比以后值更小的值,找到即为最小值
- 找到最小值后替换以后索引值以及最小值所在索引值
- 反复遍历
源代码:
冒泡排序
思路:
- 从数组索引0开始,只有以后值比他下一位值大,替换两者程序。
- 反复遍历
源代码:
位运算
- a ^ b 雷同为0 不同为1
- 位运算满足交换律和结合律 即: a^b = b^a; (a^b)^c = a^(b^c)
- 0 ^ N = N; N^N = 0;
- 位运算能够了解为二进制的不进位相加
比方: 101 ^ 011 = 110;通过这个,能够进一步了解为什么满足交换律 因为无论多少个数字异或,那么雷同地位上是1 还是0 齐全取决于1 和0的数量,与程序无关
所以反过来看冒泡排序中的swap,原理如下:
但值得注意的是,其中i和j不能是雷同值,雷同值相当于本人和本人异或 那么会清0 导致计算结果不精确。
- 提取一个数最右的1:
int rightOne = eor & (~eor +1)
;原理如下:
思路:本人与本人取反加1;
原题:数组中有两个数是奇数个,其余数为偶数个,找出这两个数:
插入排序
思路:
- 从数组索引1开始,向前比拟找到适合的地位插入
源代码:
相较于抉择和冒泡,插入排序最差是On^2 最好是On 依据数据状况来定,绝对性能较好
二分法
常见问题:
- 有序数组 找某个数是否存在
- 有序数组 找大于某个数最左侧的地位
- 部分最小值
一个arr中 任意两个元素相邻数肯定不相等,找任意一个部分最小值,部分最小为i 比i-1, 比i+1 都小。要求工夫复杂度好于On 最好用二分
思路:
解释:首先判断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问题非凡能够优化