插入排序:
    思路:
    设长度 n , 计数器 i
    1.每次扩增一个数字 i++,往该数字的前面依次做比较 如果小于 前面的数则交换
    2.外层循环终止条件 i == n
    3.内层循环终止条件 j < 0 || nums[j] >= nums[j - 1];
    最差状况下 时间复杂度 O(N ^ 2)
    最优情况下 O(N);
    时间复杂度取最差情况下;

    二分排序:
    O(log2N)
    1.升序找值
    2.升序找边界
    3.局部最小最大(二分不一定要有序
    两个方向入手
    1.数据状况
    2.问题标准

    常规情况下在升序数组中做二分
    局部最大值:
    162. 寻找峰值
    难点:1.如何二分?
    //left 与 right 代表左边界与右边界
    思路:1.局部最大值 性质: nums[left] > nums[left + 1] left为局部最大值 此时 left ~ left + 1 呈现下降趋势
    反之呈现上升趋势
    2. nums[right] > nums[right - 1] right 为局部最大值 right - 1 ~ right 呈现下降趋势 反之 呈现上升趋势
    3.在 1 2 均不成立 即 当前 nums[left] 与nums[right] 都不是局部最大值时
    可得 left ~ left + 1 升序 right ~right -1 升序
    所以 left ~ right 之间必存在一个峰值 也就是left与right的交汇点
    4.建立在 3 基础上 取mid值 (mid = (left + right) / 2)
    若 nums[mid - 1] < nums[mid] && nums[mid] >nums[mid + 1] 那么nums[mid] 就是峰值
    若 nums[mid] 不是峰值,可分以下几种情况:
    1)nums[mid - 1] > nums[mid]
    mid ~ mid - 1 之间呈现上升趋势
    缩小right边界
    2)nums[mid] < nums[mid + 1]
    mid ~ mid + 1 之间呈现上升趋势
    扩大left边界
    ps:这里有个分歧点 当 nums[mid] < nums[mid - 1] 与 nums[mid] < nums[mid + 1] 同时成立 根据代码选择可以选择 1 或 2 情况下 都对。