数据结构4 顺序查找与折半查找

【顺序查找 (针对无序的数据,有序的数据可以用更高效的数据查找方式)

在无序的数据查找中, 顺序查找是最入门、最简单的算法,该算法虽然简单,但是当数据量增多时,查找效率较低。比如在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。

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值