顺序查找折半查找的区别与联系
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;
}
以上是关于顺序查找折半查找的区别与联系的主要内容,如果未能解决你的问题,请参考以下文章