【顺序查找 (针对无序的数据,有序的数据可以用更高效的数据查找方式)】
在无序的数据查找中, 顺序查找是最入门、最简单的算法,该算法虽然简单,但是当数据量增多时,查找效率较低。比如在100万数据中,平均需要查找大约50万次,从算法角度来说,是很难接受的。
从算法角度来说,很自然要考虑到算法的优化。经过查找相关,关于无顺序数据处理,在数据库中有对应处理方法,还有可以创建索引,哈希方式处理等,嗯,,先留个印象,慢慢学。
------------------------------------------------------
言归正传,下面是简单的顺序查找的代码,
顺序查找思想很简单,就是扫描一遍无序数据,并在扫描过程中比较是否找到对应数据,如果找到了,可以返回对应的索引值;如果没找到,可以返回没找到。
#include<iostream>
using namespace std;
// 顺序查找
int SequentialSearch(int* list1, int length, int num) {
for (int i = 0; i = length; i++) {
if (list1[i] == num) {
return i; //已经找到该数据,返回索引
}
if (i == length) {
return -1; //说明序列中不存在该数据
}
}
}
int main() {
int length = 15;
int num = 99; //需要查找的数据
int list1[] = { 3, 44, 38, 5, 47, 15, 36, 26,27,2,46,4,19,50,48 };
int index = SequentialSearch(list1, length, num);
cout << "顺序查找的结果: " << endl;
if (index <0) {
cout << "没有找到!!!!" << endl;
}
else {
cout << "索引为: " << index << endl;
}
system("pause");
}
【折半查找】
针对有序数据,折半查找是一种高效的数据查找算法。
下面图是一般折半查找算法查找过程,在查找前要先确定low,high,mid三个变量,这三个变量代表数据的索引位置,每次折半会减小当前一半的数据(建立在有序数据的基础上)。
#include<iostream>
using namespace std;
/* 折半查找法:
折半查找法针对有序的数据,是一种非常高效的数据查找法
1M 数据, 大约100万, 利用折半查找最差情况下大约寻找20次
1G数据, 大约10亿, 利用折半查找最差情况下大约寻找30次
*/
int BinarySearch(int* list, int length, int num) {
//定义三个索引变量
int low, high, mid;
low = 0;
high = length - 1;
while (low <=high) {
// 判断元素是否找到
mid = (low + high) / 2;
if (list[mid] == num) {
return mid;
}
else if (list[mid] < num) {
//说明查找的数据 在中间的数据右边
low = mid + 1;
}
else {
//说明查找的数据在 中间的左边
high = mid - 1;
}
}
// 代码运行到这里说明在中途没有跳出,说明没有在数据序列中找到这个数据,返回查找失败
return -1;
}
int main() {
int length = 15; //数据个数
int num = 1122; //需要查找的数据
int list1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15};
// 函数返回对应的索引值
int index = BinarySearch(list1, length, num);
cout << "折半查找数据结果: " << endl;
if (index == -1) {
cout << "没有找到!!!" << endl;
}
else {
cout << "查找的索引为: " << index << endl;
}
system("pause");
}
通过折半查找不难发现,它每次都会将数据减小一般,所以这是一种二叉树结构,父节点正好就是中间的mid,而左分支与右分支就是当前的low与high。