#algorithem/左神算法/基础 #sorting #XOR
- 评估算法优劣的核心标准
- 时间复杂度(流程决定)
- 额外空间复杂度(流程决定)
- 常数项时间(实现细节决定)
- 常数时间的操作
- 算数运算-加减乘除
- 位运算( >>[带符号右移]/ >>>[不带符号右移]/ <</ |/ &/ ^)
- 赋值、比较、自增、子减
- 数组寻址
- 三种排序
- 选择排序:遍历整个数组找最大,放在最后
- 冒泡排序:相邻的两个数比较谁大谁放在后面
- 插入排序:第k次循环的时候,保证k角标之前的数组有序
- 第k个数字往前冒泡
- ::数据的初始状况会影响时间复杂度::
- 已排好的数组:O(N)
- 完全反着排的数组:O(N^2) -> 最差情况
- 对数器(用于测试)
- 有一个你想要测的方法a,
- 实现一个绝对正确但是复杂度不好的方法b
- 实现一个随机样本产生器
- 实现比对的方法
- 把方法a和方法b比对很多次来验证方法a是否正确。
- 如果有一个样本使得比对出错,打印样本分析是哪个方法出
错 - 当样本数量很多时比对测试依然正确,可以确定方法a已经
正确。
- 二分法:构建出一种可以排掉另外一边的逻辑
- n * 2 + 1 = ( n << 1) | 1
- eg. 局部最小数:返回一个无序的,去重的数组中 比左右的数都小的数
- 逻辑:通过判断中间的数和它相邻的数的大小关系来判断这两个数处于递增段还是递减段
public static int getLessIndex(int[] arr) {
if (arr == null || arr.length == 0) {
return -1; // don't exists
}
if (arr.length == 1 || arr[0] < arr[1]) {
return 0;