在二分搜索应用于未排序的数组时加入部分检测程序—编程珠玑第五章习题5
来源:互联网 发布:jquery confirm.js 编辑:程序博客网 时间:2024/06/06 19:26
在二分搜索应用于未排序的数组时加入部分检测程序—编程珠玑第五章习题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;
- }
- 在二分搜索应用于未排序的数组时加入部分检测程序—编程珠玑第五章习题5
- 编程珠玑第五章习题五——C++实现二分搜索时进行错误检测
- 《编程珠玑》---编写正确的二分搜索程序
- 【编程珠玑】第十一章排序 习题
- 编程珠玑第五章二分搜索(折半查找)之java实现
- 编程珠玑第二版第五章习题(Java)
- 编程珠玑之二分搜索
- 编程珠玑第1章部分课后习题答案注解
- 编程珠玑第2章部分课后习题答案注解
- 编程珠玑第五章
- 编程珠玑第五章
- 编程珠矶 习题 4.6 利用二分搜索找到一个数在顺序数组里面的下限和上限
- 编程珠玑第八章——习题10查找数组中总和最接近0的子数组
- 编程珠玑第二章习题—向量的旋转
- 编程珠玑 第二章 习题5
- 编程珠玑之第二章习题5
- 编程珠玑之第三章习题5
- 编程珠玑——第二章习题
- ThinkPHP自定义函数解决模板标签加减运算 (来自aoyoo111)
- session
- C++内部连接和外部连接
- 6、一个 pthread_cancel 引起的线程死锁【整理转载】
- EJB到底是什么,真的那么神秘吗??
- 在二分搜索应用于未排序的数组时加入部分检测程序—编程珠玑第五章习题5
- tcpdump 使用
- NavigationViewController的backBarButtonItem的设置技巧 ...
- VS2005下opengl的helloworld
- hdu 2845 Beans--二维DP
- 阻抗匹配
- 7、取消点的进一步讨论
- Android中的多线程-Timer
- android 设备唯一码的获取,Cpu号,Mac地址