在二分搜索应用于未排序的数组时加入部分检测程序—编程珠玑第五章习题5
大家都知道二分搜索算法应该用在已经排序好的数组中,但是有时候会犯一些错误,一个常见的错误就是把二分搜索应用于未排序的数组,而在每次搜索前检测整个数组是否有序需要进行n-1次额外的比较。
1.测试,断言优化问题
可以加入:
for(i=0;i<=n-1;i++)
assert(a[i]<a[i+1]);
2.在程序中进行检测
- int bs(int *a, int b, int e, int v)
- {
- int *begin = a + b, *end = a + e, *mid;
- if (!a || b >= e) return -1;
- while (begin < end)
- {
- mid = begin + ((end - begin) >> 1);
- assert(*begin <= *mid && *mid <= *end);
- if (*mid > v) end = mid;
- else if (*mid < v) begin = mid + 1;
- else return mid - a;
- }
- return -1;
- }
上面的那种方法在程序中加入了一些检测条件,但是这个方法需要多次使用才能检测出来,也就是可能在查找某两个数的时候不会报错,但是在查找别的几个数的时候就会报错了。还需要改进。
- int bs(int *a, int b, int e, int v)
- {
- int *begin = a + b, *end = a + e, *mid, i = b;
- static int *record = 0;
- if (!a || b >= e) return -1;
- if (!record || record != a)
- {
- while (i < e && a[i] < a[i+1]) ++i;
- assert(i == e);
- }
- while (begin < end)
- {
- mid = begin + ((end - begin) >> 1);
- assert(*begin <= *mid && *mid <= *end);
- if (*mid > v) end = mid;
- else if (*mid < v) begin = mid + 1;
- else return mid - a;
- }
- return -1;
- }