- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2013-06-19 14:44 编辑
yulihua49 发表于 2013-06-14 15:45 ![]()
mark ----
做了一个实用化的,可以是任意结构数组,自定义key:- #include <Binary_search.h>
- #include <Binary_search.h>
- int lowerBound(void *key,void *data,int data_count,int (*compare)(void *key,void *data,int n))
- {
- int middle,start=0,end=data_count-1,val;
- while (start <= end) {
- middle = (start + end) >> 1;
- //printf("lower:start=%d,end=%d,middle=%d\n",start,end,middle);
- val=compare(key,data,middle); //data - key
- if (!val && (!middle||compare(key,data,middle - 1) < 0)) return middle;
- else if (val>=0) end = middle - 1;
- else start = middle + 1;
- }
- return -1;//不存在
- }
- int upperBound(void *key,void *data,int data_count,int (*compare)(void *key,void *data,int n))
- {
- int middle,start=0,end=data_count-1,val;
- int result=-1;
- if(!key||!data) return -1;
- while(start <= end) {
- middle=(start+end+1)>>1;
- //printf("upper:start=%d,end=%d,middle=%d,result=%d\n",start,end,middle,result);
- val=compare(key,data,middle);
- if(val>0) {
- if(!middle||compare(key,data,middle - 1) <= 0)
- result=middle;
- end=middle-1;
- } else {
- start=middle+1;
- }
- };
- return result;
- }
- /* UP=KEY
- {
- int middle,start=0,end=data_count-1,val;
- while (start <= end) {
- middle = (start + end+1) >> 1;
- //printf("start=%d,end=%d,middle=%d\n",start,end,middle);
- val=compare(key,data,middle);//data - key
- if (!val && (middle==data_count-1||compare(key,data,middle + 1) > 0)) return middle;
- else if (val>0) end = middle ;
- else start = middle + 1;
- }
- return -1;//不存在
- }
- */
复制代码 upperBound()进行了一点小调整,否则会有疏漏。 |
|