二分法,究其根本就是在已经排好序的基础上进行的数据查找,该方法具有较高的效率,特别好用
// 进化的二分法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
template<class Any>
int Find_By_Binary(Any* ptr ,int nLength,Any value)
{
int low=0,high=nLength-1;
int middle=(low+high)/2;
while(low<=high)
{
if(value<ptr[middle])
{
high=middle-1;
}
else if(value==ptr[middle])
{
return middle;
}
else
{
low=middle+1;
}
middle=(low+high)/2;
}
return -1;
}
int _tmain(int argc, _TCHAR* argv[])
{
int ptr[5]={2,3,5,8,9};
cout<<Find_By_Binary(ptr,5,5)<<endl;
double dptr[5]={2.2,5.6,5.7,6.3,8.2};
cout<<Find_By_Binary(dptr,5,5.9)<<endl;
return 0;
}
如果提高一下难度呢?因为我们不知道获得的数据是第一个,或者说根本不了解所获取数据的位置,可以说是随机的,如果我们想要得到的是第一个,或者是最后一个呢???
不要着急,我们分别来说下,首先呢,是获取特定数据第一次出现的位置其原理就是记录每次该值出现的位置,一直到最后一次,,如果某值出现,那么向下查找,因为我们找的是第一次出现的啊,假定该位置一定不是第一次出现,那么向前查找,就是将high=middle-1;即可如果是最后一次出现的呢,就是不断向后查找将low=middle+1;即可
代码如下
// 进化的二分法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
template<class Any>
int getFirstBinarySearch(Any* ptr ,int nLength,Any value)
{
int low=0,high=nLength-1;
int middle=(low+high)/2;
int nPos=-1;
while(low<=high)
{
if(value<ptr[middle])
{
high=middle-1;
}
else if(value==ptr[middle])
{
nPos=middle;
high=middle-1;
}
else
{
low=middle+1;
}
middle=(low+high)/2;
}
return nPos;
}
template<class Any>
int getLastBinarySearch(Any* ptr ,int nLength,Any value)
{
int low=0,high=nLength-1;
int middle=(low+high)/2;
int nPos=-1;
while(low<=high)
{
if(value<ptr[middle])
{
high=middle-1;
}
else if(value==ptr[middle])
{
nPos=middle;
low=middle+1;;
}
else
{
low=middle+1;
}
middle=(low+high)/2;
}
return nPos;
}
int _tmain(int argc, _TCHAR* argv[])
{
int ptr[8]={2,3,5,8,9,9,9,10};
cout<<"第一次出现的位置是"<<getFirstBinarySearch(ptr,8,9)<<endl;
cout<<"最后一次出现的位置是"<<getLastBinarySearch(ptr,8,9)<<endl;
return 0;
}
谢谢