二分查找
int l = 0, r = cSize - 1, mid; while (l < r) { mid = (l + r) >> 1; if (tmp > array[mid]) { l = mid + 1; } else { r = mid; } }
return l;
最终得到第一个大于等于tmp的数组元素的下标。
当l = r - 1时,mid = (l + r) >> 1 == l,假设l = i,则r = i + 1,mid = (2 * i + 1) / 2 = i。所以l = mid + 1。
tmp 大于array[mid] 时,向右l = mid + 1, 左边的元素包括array[mid] 都小于tmp,不管;其他情况,向左移动,array[r] = array[mid],右边的元素array[mid + 1]以及之后的元素一定大于tmp,不管。范围不断缩小,最后变成l = r - 1的情况,变成tmp 和array[l]比较。
如果tmp小于第一个元素,得到0。
如果tmp大于最后一个元素,得到size - 1。
浙公网安备 33010602011771号