顺序查找、折半查找的区别与联系

52 篇文章 2 订阅

    顺序查找、折半查找,都是在一个线性表中,查找指定的关键字。它们的区别是,折半查找需要该线性表本身是有序的,而顺序查找则没有这个限制。对比其时间复杂度,如下:

算法对比顺序查找折半查找 (二分查找)
平均时间复杂度O(n)O(logn)

1、顺序查找

    基本思路:将线性表遍历一遍,若找到所需的关键字,则返回该关键字在线性表中的索引号,若没有找到,则返回-1。
    //顺序查找源码:

int SequenceSearch(vector<int> list, int key) {
	for (int i = 0; i < list.size(); i++) {
		if (key == list[i]) //若已找到,则返回该元素的下标
			return i;
	}

	//若未找到,返回-1
	return -1;
}

2、折半查找

    基本思路:假设线性表是升序排列,将要查询的元素k与线性表中间的元素R[mid]进行比较,若K=R[mid],则查找成功;
    若K<R[mid],则在左子区间R[0,mid-1]进行查找;
    若K>R[mid],则在右子区间R[mid+1,n]进行查找;
    每查找一次,搜索区间减半,如此循环往复,直到找到该元素,或者搜索变为空为止,表示没有找到。

    //折半查找源码

//折半查找
int BinarySearch(vector<int> list, int key) {
	int low = 0;
	int high = list.size() - 1;
	while (low <= high)
	{
		int mid = (low + high) / 2;
		if (list[mid] == key)
			return mid;

		if (list[mid] > key) {
			high = mid - 1;
		} else {
			low = mid + 1;
		}
	}
	
	//若未找到,返回-1
	return -1;
}

3、完整源码

    //search.cpp

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int SequenceSearch(vector<int> list, int key) {
	for (int i = 0; i < list.size(); i++) {
		if (key == list[i]) //若已找到,则返回该元素的下标
			return i;
	}

	//若未找到,返回-1
	return -1;
}

//折半查找
int BinarySearch(vector<int> list, int key) {
	int low = 0;
	int high = list.size() - 1;
	while (low <= high)
	{
		int mid = (low + high) / 2;
		if (list[mid] == key)
			return mid;

		if (list[mid] > key) {
			high = mid - 1;
		} else {
			low = mid + 1;
		}
	}
	
	//若未找到,返回-1
	return -1;
}

//希尔排序
void ShellSort(vector<int> &list) {
	int step = list.size() / 2;
	while (step >= 1)
	{
		for (int i = step; i < list.size(); i++)
		{
			int tmp = list[i];
			int j = 0;
			for (j = i - step; j >= 0 && tmp < list[j]; j = j - step)
			{
				list[j + step] = list[j];
			}
			list[j + step] = tmp;
		}
		step = step / 2;
	}
}

//输出所有的元素
void printList(vector<int> list){
	for (int i = 0; i < list.size(); i++){
		printf("%d ", list[i]);
		if ((i + 1) % 10 == 0)
			printf("\n");
	}
	printf("\n");
}



int main(){

	int arry[6] = { 40, 20, 80, 50, 30, 60 };
	vector<int> dataVec(arry, arry + 6);

	int key = 20;
	int id = SequenceSearch(dataVec, key);
	printf("find %d, id=%d\n",key, id);


	//2)先对数组进行排序,使其有序
	ShellSort(dataVec);
	printList(dataVec);
	//2.2) 然后使用折半查找
	int id2 = BinarySearch(dataVec, key);
	printf("find %d, id2=%d\n", key, id2);


	system("pause");
	return 0;
}
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值