在这里简单介绍一下哨兵。在很多数据结构书中,对顺序查找使用了哨兵。其实加“哨兵”是早期数据结构中的事,当时的语言工具是汇编级别吧。由于数组是从下标0开始的,我们对arr[0]赋值就改变了这个数组。按照现代软件工程,安全与封装更重要。在目前的Java解决方案中,人们实在懒得再提起此项技术了。所以在下列的顺序查找算法中,并没有使用哨兵。
#include <iostream.h>
int SeqSearch(int arr[], int len, int target)
{
for (int i=0; i<len; i++)
{
if (arr[i] == target)
{
return i;
}
}
return -1;
}
int BinSearch(int arr[], int len, int target)
{
int low = 0;
int high = len-1;
while (low <= high)
{
int mid = (low + high) / 2;
if (arr[mid] == target)
{
return mid;
}
else if (arr[mid] > target)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return -1;
}
int BinSearchRecu(int arr[], int target, int low, int high)
{
if (low > high)
{
return -1;
}
int mid = (low + high) / 2;
if (arr[mid] == target)
{
return mid;
}
else if (arr[mid] > target)
{
return BinSearchRecu(arr, target, low, mid - 1);
}
else
{
return BinSearchRecu(arr, target, mid + 1, high);
}
}
void main()
{
int arr[] = {5,13,19,21,37,56,64,75,80,88,92};
int len = sizeof(arr) / sizeof(arr[0]);
cout<<SeqSearch(arr, len, 75)<<endl;
cout<<BinSearch(arr, len, 75)<<endl;
cout<<BinSearchRecu(arr, 75, 0, len - 1)<<endl;
}