描述:使用数组存储数据并使用顺序查找、折半查找和分块查找实现查找数据的功能,并输出每种方法查找的次数。
ps:输入的数据要求有序且从小到大。
顺序查找
从头到尾遍历遍,找到就输出。
折半查找
每次查找将查找范围内的数组从中间分为两部分(mid),若要找的数据小于mid则递归遍历左半部分,否则遍历右半部分,重复以上过程直到找到数据。
分块查找
将数组平分为三块,每一块第一个数值赋值给inx做索引值(分其他块数同理,块多建议for赋值,我是懒得for)按索引值搜索要查找的数值位于那个块中,然后遍历那个块。
最后是完整代码:
#include<iostream>
using namespace std;
const int N = 100;
int n, search, a, b, c;
int num[N], inx[3];
void ShunXu(int x) {
for (int i = 0;i < n;i++) {
a++;
if (num[i] == x) {
cout << "查找成功!该数据在第" << i + 1 << "号位置" << endl;
cout << "查找次数为:" << a << endl;
return;
}
}
cout << "该数据不存在!" << endl;
}
void ZheBan(int l,int r, int x) {
b++;
if (num[l] == x) {
cout << "查找成功!该数据在第" << l + 1 << "号位置" << endl;
cout << "查找次数为:" << b << endl;
return;
}
int mid = (l + r) / 2;
if (num[mid] > x)
ZheBan(l, mid, x);
else ZheBan(mid, r, x);
}
void Fenkuai(int x) {
int block = n / 3;
int res = 0, k = 0;
inx[0] = num[0];
inx[1] = num[block];
inx[2] = num[block * 2];
c++;
if (x < inx[1])
for (int i = 0; i < block;i++) {
c++;
if (num[i] == x) {
res = num[i];
k = i;
}
}
else if (x < inx[2])
for (int i = block; i < block * 2;i++) {
c++;
if (num[i] == x) {
res = num[i];
k = i;
}
}
else
for (int i = 2 * block; i < n;i++) {
c++;
if (num[i] == x) {
res = num[i];
k = i;
}
}
if (k != 0) {
cout << "查找成功!该数据在第" << k + 1 << "号位置" << endl;
cout << "查找次数为:" << c << endl;
}
else cout << "该数据不存在!" << endl;
}
int main() {
cout << "输入数据的个数n:" << endl;
cin >> n;
cout << "输入n个数据:" << endl;
for (int i = 0;i < n;i++) cin >> num[i];
cout << "输入要查找的数据:" << endl;
cin >> search;
cout << "顺序查找的结果为:" << endl;
ShunXu(search);
cout << "折半查找的结果为:" << endl;
ZheBan(0, n - 1, search);
cout << "分块查找的结果为:" << endl;
Fenkuai(search);
return 0;
}
// 9 1 12 33 44 114 514 810 1919 2022