#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//折半查找的时间复杂度为O(logn) 但对于需要频繁执行插入或删除操作
//的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用
int Binary_Search(int* a, int index, int key)
{
int low = 0;
int high = index;
int mid;
while (low <= high)
{
mid = low + (high-low) / 2;
if (a[mid] == key)
return mid;
else if (key > a[mid])
low = mid + 1;
else
high = mid - 1;
}
return -1; //返回-1则没找到
}
//插值查找是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法
//其核心就在于插值的计算公式 key-a[low]/a[high]-a[low] 从时间复杂度来看也是O(logn)
//但对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找的性能比折半查找好
int Interpolation_Search(int* a, int index, int key)
{
int low = 0;
int high = index;
int mid;
while (low <= high)
{
mid = low + (high - low)*(key - a[low]) / (a[high] - a[low]); //插值
if (a[mid] == key)
return mid;
else if (key > a[mid])
low = mid + 1;
else
high = mid - 1;
}
return -1; //返回-1则没找到
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = { 0,1,16,24,35,47,59,62,73,88,99 };
//俩个函数的第二个参数是数组的下标 要注意大小
int flag1 = Binary_Search(a, sizeof(a) / sizeof(a[0])-1, 100);
int flag2 = Interpolation_Search(a, sizeof(a) / sizeof(a[0])-1, 100);
if (flag1 == -1)
cout << "没找到" << endl;
else
cout << "找到了" << endl;
if (flag2 == -1)
cout << "没找到" << endl;
else
cout << "找到了" << endl;
return 0;
}
有序表查找(折半查找与插值查找)
最新推荐文章于 2020-07-22 10:39:26 发布