目录
1 顺序查找(Sequence Search)
顺序查找适用于存储结构为顺序存储或链式存储的线性表。
基本思想:
顺序查找也称为线形查找,属于无序查找算法。从数据结构线性表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定K值进行比较,若相等则表示查找成功,若扫描结束仍旧没有找到关键字等于K的结点,则表示查找失败。
算法实现:
#include<iostream>
using namespace std;
int SequenceSearch(int a[], int value, int n)
{
int i;
for (i = 0; i<n; i++)
if (a[i] == value)
return i;
return -1;
}
int main()
{
int a[] = { 2, 3, 5, 8, 6, 7, 9, 0 };
int key, index;
int n = sizeof(a) / sizeof(a[0]);
cout << "请输入待查找的值:" << endl;
cin >> key;
index = SequenceSearch(a, key, n);
if (index >= 0)
{
cout << "找到了" << endl;
}
else
{
cout << "没找到" << endl;
}
system("pause");
return 0;
}
2 二分查找(Binary Search)
说明:元素必须有序方能使用,无序则要先进行排序。
基本思想:
二分查找也叫折半查找,属于有序查找算法。用给定K值先与中间节点的关键字进行比较,中间节点把线性表分层两个子表,若相等则查找成功;若不相等,再根据K与中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找或查找结束没有发现表中有这样的结点。
算法实现:
#include<iostream>
using namespace std;
//二分查找(折半查找),版本1
int BinarySearch1(int a[], int value, int n)
{
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (a[mid] == value)
return mid;
if (a[mid]>value)
high = mid - 1;
if (a[mid]<value)
low = mid + 1;
}
return -1;
}
//二分查找,递归版本
int BinarySearch2(int a[], int value, int low, int high)
{
int mid = low + (high - low) / 2;
if (a[mid] == value)
return mid;
if (a[mid]>value)
return BinarySearch2(a, value, low, mid - 1);
if (a[mid]<value)
return BinarySearch2(a, value, mid + 1, high);
}
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int key, len;
cout << "请键入KEY值:" << endl;
cin >> key;
len = sizeof(a) / sizeof(a[0]);
//int index = BinarySearch1(a, key, len);
int index = BinarySearch2(a, key, 0, len-1);
if (index >= 0) cout << "找到" << endl;
else cout << "没找到" << endl;
system("pause");
return 0;
}
3 插值查找(Interpolation Search)
插值查找是根据要查找的关键字Key与查找表中最大最小记录的关键字比较后的查找方法,其核心在于插值的计算公式:Key-arr[low]/arr[high]-arr[low]。mid的计算公式为:(high-low)*(key-arr[low])/(arr[high]-arr[lo