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

Posted sanqima

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序查找折半查找的区别与联系相关的知识,希望对你有一定的参考价值。

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

算法对比顺序查找折半查找 (二分查找)
平均时间复杂度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;
}

以上是关于顺序查找折半查找的区别与联系的主要内容,如果未能解决你的问题,请参考以下文章

折半查找的概念及实现代码

浅谈顺序折半查找

数据结构 查找表的顺序查找折半查找插值查找以及Fibonacci查找

数据结构-查找

王卓数据结构与算法之查找算法

二分查找---顺序查找