现在的位置: 首页 > 综合 > 正文

c 二分查找算法

2017年12月28日 ⁄ 综合 ⁄ 共 1406字 ⁄ 字号 评论关闭

/*
   二分查找法:
   优点:比较次数少,查找速度快,平均性能好
   缺点:查找表要求是有序序列,且插入删除困难
   使用范围:折半查找方法适用于不经常变动而查找频繁的有序列表
   原理:假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
   时间复杂度:假设其数组长度为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;
}

#endif


【上篇】
【下篇】

抱歉!评论已关闭.