二分查找法:
优点:比较次数少,查找速度快,平均性能好
缺点:查找表要求是有序序列,且插入删除困难
使用范围:折半查找方法适用于不经常变动而查找频繁的有序列表
原理:假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
时间复杂度:假设其数组长度为n,其算法复杂度为o(log(n))
注意事项:
*/
#ifndef MY_BINARYSEARCH_H
#define MY_BINARYSEARCH_H
#ifdef __cplusplus
extern "C"
{
#endif
typedef int (*BSCompareFunc)(void *data1, void *data2);
int binarySearchShowForInt(int array[], int lenght, int find);
int binarySearchShow(void **array, int lenght, void *FindData, BSCompareFunc compareFunc);
#ifdef __cplusplus
}
#endif
上面的是.h头文件
下面的是原文件
#include "myBinarySearch.h"
/*
int array[]: 被查找的数组
int lenght : 被查找的数组的长短
int find : 要查找的数据
*/
int binarySearchShowForInt(int array[], int lenght, int find)
{
if(array == 0 || find == 0)
{
return -1;
}
int start = 0;
int end = lenght-1;
while(start <= end)
{
int middle = start +((end-start)>>1); //中间序列
if(array[middle] == find)
{
return middle;
}
else if(array[middle]<find)
{
start = middle+1;
}
else
{
end = middle-1;
}
}
return -1;
}
/*
void **array: 被查找的数组
int lenght : 被查找的数组长度
void *FindData: 要查找的数据
BSCompareFunc compareFunc: 数据比较函数
*/
int binarySearchShow(void **array, int lenght, void *FindData, BSCompareFunc compareFunc)
{
if(array == 0 || FindData ==0)
{
return -1;
}
int start = 0;
int end = lenght -1;
while(start <= end)
{
int middle = start +((end-start)>>1);
int icompare = compareFunc(array[middle], FindData);
if(icompare == 0)
{
return middle;
}
else if(icompare <0)
{
start = middle+1;
}
else
{
end = middle -1;
}
}
return -1;
}