查找数据,是每个程序员必备的技能,今天介绍一种在数组中快速查找的方法:二分查找法,
二分法在前面已经介绍过了,取一个数字的中间值,如果不对,再取。。 一直循环到最终的结果。
此方法比直接在for循环里面循环遍历话费时间要少的多。
下面介绍一种常见的二分查找法。
// 编程算法之数组二分查找法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
int arrNum[1024];
int seachNum = 733;
int start = 0;
int end = 1023;
int middle;
int _tmain(int argc, _TCHAR* argv[])
{
for (int i = 0; i < 1024; i++)
{
arrNum[i] = i;
}
while (start<end)
{
middle = (start+end)/2;
if (seachNum ==arrNum[middle] )
{
printf("find it%d\n",middle);
break;
}
else if (seachNum>arrNum[middle])
{
start = middle+1;
}
else
{
end = middle-1;
}
printf("start=%d midlle=%d end=%d\n",start ,middle,end);
}
return 0;
}
先定义一个数组。我们要查找的数字就在这个数组里面,再定义一个开始查找的节点跟结束查找的节点。
for循环里是给这个数组初始化。
while循环就是这个算法的核心了
首先给midlle赋值这个数组的中间值,然后跟查找的值对比,如果正好相等,那么跳出循环查找结束,如不相等,就会有两种情况 查找的值 大于中间值和小于中间值。
那么我们来分析如果查找值大于中间值会怎样, 大于中间值,说明我们的end值是没有错的,是start小,我们就给srart重新赋值为middle的下一个值,就是让它下次截取大的那一半。
如果查找值小于中间值,说明我们的start是没错的,end值选的太大,那么我们就给end重新赋值为middle的上一个。截取小的一半。
此算法我们8步就找到了733 是不是很节省时间呢?
注意:此算法适用于有序的数组排列。