本文实现对有序的序列的二分查找,比较简单
Description |
对输入的有序关键字序列建表,并利用折半查找,查找关键字,返回查找次数。 例如: 输入 9 12 14 22 38 45 49 62 68 75 38 输出: 4 说明:输入第一行为输入关键字数;第二行为关键字序列;第三行为待查关键字 输出:为查找次数。 |
Sample Input |
9 12 14 22 38 45 49 62 68 75 38 |
Sample Output |
4 |
Hint |
输出有换行符 |
#include <bits/stdc++.h>
using namespace std;
typedef struct
{ // 可定义多种不同类型的数据类型
int key;
int info; // 其他数据类型的权值
} Elem;
typedef struct
{
Elem *R; // 数组表基址一般下标为0不存值
int len; // 长度
} Stable;
void initST(Stable &ST)
{ // 线性初始化
ST.R = new Elem[100];
}
void creat_ST(Stable &ST, int n)
{ // 创建线性数组
ST.len = n;
for (int i = 1; i <= ST.len; i++)
{
cin >> ST.R[i].key;
}
}
int serch_bin(Stable ST, int key)
{ // 二分查找(前提是有序)
int low = 1, cnt = 0;
int high = ST.len;
while (low <= high)
{
cnt++;
int mid = (low + high) / 2;
// cout << mid;
if (ST.R[mid].key == key)
{
return cnt;
}
else if (ST.R[mid].key < key)
{
low = mid + 1;
}
else if (ST.R[mid].key > key)
{
high = mid - 1;
}
}
return 0; // 0就是没找到
}
int main()
{
Stable ST;
initST(ST);
int n, key;
cin >> n;
creat_ST(ST, n);
cin >> key;
cout << serch_bin(ST, key) << "\n";
return 0;
}