折半查找算法的使用中防止溢出的问题

维基上的代码:

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= "9290"
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 = 9 head = 6 , tail = 12 ,
words[9] = "900" , result = 1

count = 2  cursor = 10 head = 9 , tail = 12 ,
words[10] = "91" , result = 1

count = 3  cursor = 11 head = 10 , tail = 12 ,
words[11] = "929" , result = 1

------------------
cursor = 11 head = 11 , tail = 12 ,
words[11] = "929" , result = 1


====================
第二个算法 sizeof = 12
keys= "9290"
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 = 12 ,
count = 0 middle = 6, left = 0 , right = 12 ,
words[6] = "5" , result = 1


count = 1 middle = 9, left = 7 , right = 12 ,
words[9] = "900" , result = 1


count = 2 middle = 11, left = 10 , right = 12 ,
words[11] = "929" , result = 1


---------------------
middle = 12, left = 12 , right = 12 ,
words[12] = "烫烫烫烫9290" , result = 1
 请按任意键继续. . .


忙于工作,有机会再研究效率的问题。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。