1.顺序查找

从数组起始扫描到数组结尾,判断该索引数组是否和关键字相等,成功返回1

代码如下:

//顺序查找
int seqSearch(int *array, int low, int high, int key)
{
for (int i = low; i < high; i++)
{
if (array[i] == key)
return i;
}
return -;
}

2.折半查找

适用于有序数组

不停地抛弃掉一半的结点,例子如下

我们要查找key=4的结点,获取中间值mid,mid=(low+high)/2,所以mid=(1+7)/2=4,发现4小于10,则可以锁定key的位置在mid的左侧,此时使mid减一

mid=(1+3)/2=2,我们发现4依然小于8,则锁定key的区域在mid左边,mid再减一

此时low=high=1,所以mid=1,以mid为索引的数组正好等于4,找到key,返回成功

代码如下:

//折半查找(只适用于已经排序好的)
int binarySearch(int *array, int low, int high, int key)
{
while (low <= high)
{
//从中间划分
//mid如果不是整数,则直接向下取整,不会影响查找结果
int mid = (low + high) / ;
//正好是中间这个数
if (key == array[mid])
return mid;
//数比中间的数大,则在后半部分再切一刀缩小范围
else if (key > array[mid])
low = mid + ;
//数比中间的数小,则在前半部分再切一刀缩小范围
else
high = mid - ;
}
return -;
}

3.插值查找

适用于有序数组

优化中点mid的选择,逻辑和折半查找一致,以更科学的mid点划分左右区域

//插值查找(只适用于已经排序好的)
//和折半查找逻辑一致,修改了mid值
int interpolationSearch(int *array, int low, int high, int key)
{
while (low <= high)
{
//优化中间值
int mid = low+(key-array[low])/(array[high]-array[low])*(high - low-);
//正好是中间这个数
if (key == array[mid])
return mid;
//数比中间的数大,则在下半部分再切一刀缩小范围
else if (key > array[mid])
low = mid + ;
//数比中间的数小,则在上半部分再切一刀缩小范围
else
high = mid - ;
}
return -;
}

4.代码汇总+测试

#include<stdlib.h>
#include<iostream>
using namespace std; int seqSearch(int *array, int low, int high, int key);
int binarySearch(int *array, int low, int high, int key);
int interpolationSearch(int *array, int low, int high, int key); int main(void)
{
int * array = new int[];
int low = ;
int high = ;
array[] = ;
array[] = ;
array[] = ;
array[] = ;
array[] = ;
array[] = ;
array[] = ;
int seqResult = seqSearch(array,low,high,);
cout << "顺序查找结果是:" << seqResult << endl;
int binaryResult = binarySearch(array, low, high,);
cout << "折半查找结果是:" << binaryResult << endl;
int interpolationResult = interpolationSearch(array, low, high, );
cout << "插值查找结果是:" << interpolationResult << endl; delete array;
system("pause");
return ;
} //顺序查找
int seqSearch(int *array, int low, int high, int key)
{
for (int i = low; i < high; i++)
{
if (array[i] == key)
return i;
}
return -;
} //折半查找(只适用于已经排序好的)
int binarySearch(int *array, int low, int high, int key)
{
//0 3 5 6 9 11 13 15
while (low <= high)
{
//从中间划分
//mid如果不是整数,则直接向下取整,不会影响查找结果
int mid = (low + high) / ;
//正好是中间这个数
if (key == array[mid])
return mid;
//数比中间的数大,则在后半部分再切一刀缩小范围
else if (key > array[mid])
low = mid + ;
//数比中间的数小,则在前半部分再切一刀缩小范围
else
high = mid - ;
}
return -;
} //插值查找(只适用于已经排序好的)
//和折半查找逻辑一致,修改了mid值
int interpolationSearch(int *array, int low, int high, int key)
{
//0 3 5 6 9 11 13 15
while (low <= high)
{
//优化中间值
int mid = low+(key-array[low])/(array[high]-array[low])*(high - low-);
//正好是中间这个数
if (key == array[mid])
return mid;
//数比中间的数大,则在下半部分再切一刀缩小范围
else if (key > array[mid])
low = mid + ;
//数比中间的数小,则在上半部分再切一刀缩小范围
else
high = mid - ;
}
return -;
}

C++实现顺序查找,折半查找,插值查找的更多相关文章

  1. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  2. 【Java】 大话数据结构(10) 查找算法(1)(顺序、二分、插值、斐波那契查找)

    本文根据<大话数据结构>一书,实现了Java版的顺序查找.折半查找.插值查找.斐波那契查找. 注:为与书一致,记录均从下标为1开始. 顺序表查找 顺序查找  顺序查找(Sequential ...

  3. 顺序查找 && 折半查找

    顺序查找                                                             算法描述 顺序比较即可. 平均查找长度 (n+1)/2, 其中n为表长 ...

  4. C语言查找算法之顺序查找、二分查找(折半查找)

    C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...

  5. Python 查找算法_众里寻他千百度,蓦然回首那人却在灯火阑珊处(线性、二分,分块、插值查找算法)

    查找算法是用来检索序列数据(群体)中是否存在给定的数据(关键字),常用查找算法有: 线性查找: 线性查找也称为顺序查找,用于在无序数列中查找. 二分查找: 二分查找也称为折半查找,其算法用于有序数列. ...

  6. 插值查找C++

    和上一篇折半查找很类似,只有四则运算不一样,思想类似. 只是在插值查找的过程中,考虑了查找键的值. #include <iostream> using namespace std; //需 ...

  7. CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。

    1514: Packs Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 61  Solved: 4[Submit][Status][Web Board] ...

  8. 快速排序 and 拉格朗日插值查找

    private static void QuictSort(int[] zu, int left, int right) { if (left < right) { ; ; ]; while ( ...

  9. 9.算法之顺序、二分、hash查找

    一.查找/搜索 - 我们现在把注意力转向计算中经常出现的一些问题,即搜索或查找的问题.搜索是在元素集合中查找特定元素的算法过程.搜索通常对于元素是否存在返回 True 或 False.有时它可能返回元 ...

随机推荐

  1. Hadoopd 单元测试-MPUnit

    Apache 版: 官网:http://mrunit.apache.org 教程:https://cwiki.apache.org/confluence/display/MRUNIT/MRUnit+T ...

  2. jenkins启动失败,提示Starting Jenkins Jenkins requires Java8 or later, but you are running 1.7.0

    # 背景 centos安装jenkins后,先启动jenkins服务,结果报错如下: 但自己明明已经安装了java8的 # 解决方法 既然安装了java8的话,那么证明是jenkins启动的是还是用的 ...

  3. linux清理磁盘

    https://blog.csdn.net/u012660464/article/details/78923011 有时候,服务突然挂了,再次启动却启动不了.一看,原来是磁盘空间被占满啦,那么,怎么清 ...

  4. NET Core 拓展方法和中间件集合(支持NET Core2.0+)

    # Pure.NETCoreExtentensions https://github.com/purestackorg/Pure.NETCoreExtensions NET Core 拓展方法和中间件 ...

  5. php 命令行脚本运行php文件简单演示

    众说周知,php在web服务器领域有着很重要的角色,可是它不仅仅在web领域,只是在web领域表现更为优秀! 它基本有三种用途: web服务端脚本的编写 应用程序图形界面(类似windows自带的计算 ...

  6. await使用中的阻塞和并发(二)

    本文继续上篇未完成的讨论,通过将Lambda还原成最普通的代码段,来解释上篇提出的疑问.并更正上篇中一些不太正确的写法.最后会给出无需等待Async方法返回值时,对Async方法使用await的建议, ...

  7. 【QT】二进制读取图像文件并显示

    打开对话框选择文件 二进制方式读取文件 转换成图像显示 void MainWindow::showImage() { //打开文件对话框 QString lastPath="D:/Engli ...

  8. web思维导图(前期)

  9. [Flex] 组件Tree系列 —— 打开和关闭节点

    mxm: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:打开和关闭节点--> < ...

  10. 【FAQ】调用接口序列化问题

    问题: Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException:Can not ...