查找算法
一、二分查找
首先二分查找要求元素是顺序存储结构(支持随机访问),并且查找的元素集合是有序的。
基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。
#include <stdio.h>
int BinarySearch(int nAry[], int nCount, int nValue)
{
int retIndex = -1;
int leftIndex = 0;
int rightIndex = nCount - 1;
int middleIndex = 0;
while (leftIndex <= rightIndex) // 循环条件
{
// 为防止rightIndex+leftIndex溢出,而不使用(rightIndex+leftIndex)/2
middleIndex = leftIndex + (rightIndex - leftIndex) / 2;
if (nValue > nAry[middleIndex])
{
// 这里的+1和下面的-1是为了避免死循环
// 如left=0,middle=1,right=2时,nValue>nAry[middle],
// 如果将left更新为middle,下次循环时,middle仍为1,由此以后将会死循环。所以将left更新为middle+1
leftIndex = middleIndex + 1;
}
else if (nValue < nAry[middleIndex])
{
rightIndex = middleIndex - 1;
}
else
{
retIndex = middleIndex;
break;
}
}
return retIndex;
}
int main(int argc,char* argv[])
{
int nAry[] = { 2,3,5,7,11,13,17,19 };
int nIndex = BinarySearch(nAry, sizeof(nAry) / sizeof(nAry[0]), 11);
printf("%d\r\n", nAry[nIndex]);
return 0;
}