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. Hadoop 集群配置记录小结

    Hadoop集群配置往往按照网上教程就可以"配置成功",但是你自己在操作的时候会有很多奇奇怪怪的问题出现, 我在这里整理了一下常见的问题与处理方法: 1.配置/etc/hosts ...

  2. Linux CentOS环境下.Net Core SDK安装

    1.安装.Net SDK 在安装.NET之前,需要注册产品存储库并安装所需的依赖关系. 打开Linux命令提示符并运行以下命令: sudo rpm -Uvh https://packages.micr ...

  3. poj做的题

    1699 1080 1170 1239(不错) 1659(读读怎么写)

  4. 516. Longest Palindromic Subsequence

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

  5. Termux中安装gcc-7/gfortran-7实操过程,安装成功可以编译Fortran,c/c++

    最近计算材料学的老师需要我们运行Fortran,又不想带电脑去教室.所以想起Termux了,于是就试试看这个宝贝能不能帮我的忙, 但是经过测试以后发现,clang只能编译c/c++那一类语言,不能编译 ...

  6. Windows server 2008启动remote dosktop services服务报错1079

    原创 欢迎转载,届时请注明出处 报错场景 今天,刚开始启动win server的远程连接服务(remote desktop services)时 该服务可以正常启动,然后选择了  “计算机--> ...

  7. 蹭你wifi后 我竟然干了这样的事

    前言:故事发生在前两天,我们去参观工业园区内一家电商公司. 去参观他们公司的时候,我说要用下无线网,他们技术说密码就是他们的网站域名,我一脸懵逼表示我不知道域名,然后对方接过我手机给我连上了他们wif ...

  8. 总结day2 ---- while循环的简单使用, 格式化输出.运算符.以及编码的应用

    内容提要 一 : while 循环 while 的基本语句操作 如何终止循环 二 :格式化输出 三 :运算符号 四 :编码初识别 一 : while 循环 1  >>>>whi ...

  9. delphi 10.2 ----简单的叠乘例子

    unit Unit11; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Syste ...

  10. STM32-RTC实时时钟-毫秒计时实现

    OS:Windows 64 Development kit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6 1.RTC时钟简介 STM32 的实时时钟(RTC)是一个独立的定时器, ...