线性表的查找技术
在线性表中进行查找通常属于静态查找,这种查找算法简单,主要适用于小型查找集合。
LineSearch.h
#pragma once
#include <iostream>
using namespace std;
const int MaxSize = 100;
class LineSearch
{
public:
LineSearch(int a[], int n);//构造函数
~LineSearch(){}//析构函数为空
int SeqSearch(int k);//顺序查找
int BinSearch1(int k);//二分查找 非递归
int BinSearch2(int low, int high, int k);//二分查找 递归法
private:
int data[MaxSize];//查找集合为整型
int length;//查找集合的元素个数
};
LineSearch::LineSearch(int a[], int n)
{
length = n;
for (int i = 0; i < length; i++)
{
data[i+1] = a[i];
}
}
int LineSearch::SeqSearch(int k)
{
data[0] = k;
int i = length;
while (data[i] != k)
{
i--;
}
return i;
}
int LineSearch::BinSearch1(int k)
{
int low = 1, high = length, middle;
while (low <= high)
{
middle = (low + high) / 2;
if (data[middle] > k)
{
high = middle - 1;
}
else if (data[middle] < k)
{
low = middle + 1;
}
else
{
return middle;
}
}
return 0;
}
int LineSearch::BinSearch2(int low, int high, int k)
{
if (low > high)
{
return 0;
}
else
{
int mid = (low + high) / 2;
if (data[mid] > k)
{
return BinSearch2(low, mid - 1, k);
}
else if (data[mid] < k)
{
return BinSearch2(mid + 1, high, k);
}
else
{
return mid;
}
}
}
算法改进:设置哨兵。哨兵就是待查值,存放在查找方向的尽头处,在查找过程中每次比较后,不用判断查找位置是否越界,从而提高查找速度。实践证明,这个改进在表长大于1000时,进行一次顺序查找的平均时间几乎减少一半。
LineSearch.cpp
#include "LineSearch.h"
int main()
{
int arr1[10] = { 9,8,7,6,5,4,3,2,1,10 };
int arr2[10] = { 1,2,3,4,5,6,7,8,9,10 };
LineSearch L1{ arr1, 10 }, L2{ arr2, 10 };
int select, key, index = 0;
cout << "***---选择想使用的查找算法---***" << endl
<< "1.顺序查找" << endl
<< "2.二分查找 非递归" << endl
<< "3.二分查找 递归法" << endl
<< "请输入序号:";
cin >> select;
cout << "请输入要查找的值:";
cin >> key;
switch (select)
{
case 1:
index = L1.SeqSearch(key);
break;
case 2:
index = L2.BinSearch1(key);
break;
case 3:
index = L2.BinSearch2(1, 10, key);
break;
default:
cout << "输入有误" << endl;
system("pause");
break;
}
cout << "位置为:" << index << endl;
return 0;
}