折半查找算法的使用
维基上的代码:
int binary_search(int A[], int key, int imin, int imax)
{
// continue searching while [imin,imax] is not empty
while (imax >= imin)
{
// calculate the midpoint for roughly equal partition
int imid = midpoint(imin, imax);
if(A[imid] == key)
// key found at index imid
return imid;
// determine which subarray to search
else if (A[imid] < key)
// change min index to search upper subarray
imin = imid + 1;
else
// change max index to search lower subarray
imax = imid - 1;
}
// key was not found
return KEY_NOT_FOUND;
}评估下面两个算法:
int binary_search()
{
int size ;
char keys[] = "9290";
char words[][6] ={"1","2","21","22","222","3","5","66","90","900","91","929"};
size = sizeof(words) / sizeof(words[0]);
printf("第一个算法 sizeof = %d\n", size);
int head = 0;
int tail = size;
int cursor = (head + tail) / 2;
int result = 999;
int count = 0;
printf("keys= \"%s\"\n", keys);
printf("words[i][] = \n");
for (int i = 0; i < size; ++i) printf("[%d]=\"%s\" ", i, words[i]);
do
{
result = strcmp(keys, words[cursor]);
printf("\ncount = %d cursor = %d head = %d , tail = %d , \n", count++ ,cursor, head, tail);
printf("words[%d] = \"%s\" , result = %d \n\n ", cursor, words[cursor] ,result);
if(result > 0)
{
head = cursor;
}
else if (result < 0)
{
tail = cursor;
}
else
{
break;//找到匹配的key按键组合
}
cursor = (head + tail) / 2;
}
while((head < cursor) && (cursor <= tail)); //((head <= cursor) && (cursor < tail))
printf("\n------------------\ncursor = %d head = %d , tail = %d , \n", cursor, head, tail);
printf("words[%d] = \"%s\" , result = %d \n\n", cursor, words[cursor], result);
printf("====================\n");
int left = 0, right = size - 1, middle = 0; //, result = 0;
count = 0;
printf("第二个算法 sizeof = %d\n", size);
printf("keys= \"%s\"\n", keys);
printf("words[i][] = \n");
for (int i = 0; i < size; ++i) printf("[%d]=\"%s\" ", i, words[i]);
printf("\nmiddle = %d, left = %d , right = %d , \n", middle, left, right);
while (left <= right)
{
middle = (left + right) >> 1;
result = strcmp(keys, words[middle]);
printf("count = %d middle = %d, left = %d , right = %d , \n", count++, middle , left, right);
printf("words[%d] = \"%s\" , result = %d \n\n", middle , words[middle], result);
if (result > 0)
{
left = middle + 1;
}
else if (result < 0) right = middle - 1;
else break;
}
printf("---------------------\nmiddle = %d, left = %d , right = %d , \n", middle, left, right);
printf("words[%d] = \"%s\" , result = %d \n ", middle , words[middle], result);
return cursor;
}
程序结果:
第一个算法 sizeof = 12
keys= "11"
words[i][] =
[0]="1" [1]="2" [2]="21" [3]="22" [4]="222" [5]="3" [6]="5" [7]="66" [8]="90" [9]="900" [10]="91" [11]="929"
count = 0 cursor = 6 head = 0 , tail = 12 ,
words[6] = "5" , result = -1
count = 1 cursor = 3 head = 0 , tail = 6 ,
words[3] = "22" , result = -1
count = 2 cursor = 1 head = 0 , tail = 3 ,
words[1] = "2" , result = -1
------------------
cursor = 0 head = 0 , tail = 1 ,
words[0] = "1" , result = -1
====================
第二个算法 sizeof = 12
keys= "11"
words[i][] =
[0]="1" [1]="2" [2]="21" [3]="22" [4]="222" [5]="3" [6]="5" [7]="66" [8]="90" [9
]="900" [10]="91" [11]="929"
middle = 0, left = 0 , right = 11 ,
count = 0 middle = 5, left = 0 , right = 11 ,
words[5] = "3" , result = -1
count = 1 middle = 2, left = 0 , right = 4 ,
words[2] = "21" , result = -1
count = 2 middle = 0, left = 0 , right = 1 ,
words[0] = "1" , result = 1
count = 3 middle = 1, left = 1 , right = 1 ,
words[1] = "2" , result = -1
---------------------
middle = 1, left = 1 , right = 0 ,
words[1] = "2" , result = -1
请按任意键继续. . .
当搜索失败的时候,“中间点”停留在哪里呢?能否停留在“最近似”的一个位置?忙于工作,有机会再研究。
浙公网安备 33010602011771号