二分查找需要对数组进行从小到大的排列。
这里展示了递归实现和循环实现2种方法。
#include <stdio.h>
void Bsearch(int list[], int low, int high, int key);
int binSearch(int list[], int n, int key);
void bubble_sort(int list[], int);
int main()
{
int size, i;
int list[]={41,67,34,0,69,24,78,58,62,64,5,45,81,27,61,91,95,42,27,36,91,4,2};
size=sizeof(list)/sizeof(list[0]);
printf("size=%d\n",size);
bubble_sort(list, size);
for(i = 0; i < size; i++)
{
printf("%d,", list[i]);
}
printf("using Recursion\n");
Bsearch(list, 0, size, 27);
printf("Using while loop\n");
binSearch(list,size,27);
printf("end\n");
}
void bubble_sort(int list[], int size)
{
int temp, i, j;
for (i = 0; i < size; i++)
{
for (j = i+1; j < size; j++)
{
if (list[i] > list[j]) //list[i] < list[j]
{
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
}
void Bsearch(int list[], int low, int high, int key)
{
int mid;
if (low > high)
{
printf("Key not found\n");
return;
}
mid = (low + high) / 2;
if (list[mid] == key)
{
printf("Key found,mid=%d,list[%d]=%d\n",mid,mid,list[mid]);
return;
}
else if (list[mid] > key)
{
Bsearch(list, low, mid - 1, key);
}
else if (list[mid] < key)
{
Bsearch(list, mid + 1, high, key);
}
}
int binSearch(int list[], int n, int key)
{
//n + 1 个数
int low = 0;
int high = n;
int mid = 0;
while(low <= high)
{
mid = low + ((high-low) >> 1);
if(key == list[mid])
{
printf("mid=%d,list[%d]=%d\n",mid,mid,list[mid]);
return mid;
}
else if(key < list[mid])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return -1;
}
运行结果