C++实现顺序查找,折半查找,插值查找
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++实现顺序查找,折半查找,插值查找的更多相关文章
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- 【Java】 大话数据结构(10) 查找算法(1)(顺序、二分、插值、斐波那契查找)
本文根据<大话数据结构>一书,实现了Java版的顺序查找.折半查找.插值查找.斐波那契查找. 注:为与书一致,记录均从下标为1开始. 顺序表查找 顺序查找 顺序查找(Sequential ...
- 顺序查找 && 折半查找
顺序查找 算法描述 顺序比较即可. 平均查找长度 (n+1)/2, 其中n为表长 ...
- C语言查找算法之顺序查找、二分查找(折半查找)
C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...
- Python 查找算法_众里寻他千百度,蓦然回首那人却在灯火阑珊处(线性、二分,分块、插值查找算法)
查找算法是用来检索序列数据(群体)中是否存在给定的数据(关键字),常用查找算法有: 线性查找: 线性查找也称为顺序查找,用于在无序数列中查找. 二分查找: 二分查找也称为折半查找,其算法用于有序数列. ...
- 插值查找C++
和上一篇折半查找很类似,只有四则运算不一样,思想类似. 只是在插值查找的过程中,考虑了查找键的值. #include <iostream> using namespace std; //需 ...
- CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。
1514: Packs Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 61 Solved: 4[Submit][Status][Web Board] ...
- 快速排序 and 拉格朗日插值查找
private static void QuictSort(int[] zu, int left, int right) { if (left < right) { ; ; ]; while ( ...
- 9.算法之顺序、二分、hash查找
一.查找/搜索 - 我们现在把注意力转向计算中经常出现的一些问题,即搜索或查找的问题.搜索是在元素集合中查找特定元素的算法过程.搜索通常对于元素是否存在返回 True 或 False.有时它可能返回元 ...
随机推荐
- WPF XamlObjectWriterException:无法创建未知类型"Grid"
using (FileStream fs = new FileStream("UnitFile/Report2.xaml", FileMode.Open)) { rootEleme ...
- SHOI2013 扇形面积并
题目链接:戳我 补一张图 我们尝试把圆上的扇形转化成直线上的矩形--我们维护[1,2*m]的区间,那么每个能产生贡献的子区间的长度*第K大的半径的平方的总和就是answer了. 怎么转化呢?左端点为a ...
- python网络编程--线程的方法,线程池
一.线程的其他方法(Thread其他属性和方法) ident() 获取线程id Thread实例对象的方法 isAlive() 设置线程名 getName() 返回线程名 setName() 设置线程 ...
- mongodb 备份脚本
###############备份脚本#!/bin/bash basepath="/data/backup/dump$(date +%Y%m%d%H%M%S)" if [ ! -d ...
- [bzoj3123] [SDOI2013]森林 主席树+启发式合并+LCT
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- Win10桌面图标无法拖动
1.右键桌面>查看>取消自动排列 2.桌面多按几次Esc 3.gpedit.msc “用户配置/管理模板/Windows组件/任务计划程序/禁止拖放>改为未配置
- 爬虫6:pyquery库
强大又灵活的网页解析库,如果觉得正则写起来太麻烦,BeautifulSoup语法太难记,而你又熟悉jQuery的语法,那么用PyQuery就是最佳选择 一. 初始化 1. 字符串初始化 h ...
- HTML5基础实例(三)
不知道从哪说起那就一段一段代码的说吧 实例一:iframe框架显示 写一个这样的网页: 分析: 1.需要三个链接,一个是默认的百度链接,默认显示在那个框里,另外:两个是点击跳转的超链接. 2.需要if ...
- RN 47 初始化 Bridge 过程
- (instancetype)initWithDelegate:(id<RCTBridgeDelegate>)delegate bundleURL:(NSURL *)bundleURL ...
- Springboot接口简单实现生成MySQL插入语句
Springboot接口简单实现调用接口生成MySQL插入语句 在实际测试中,有这样一个需求场景,比如:在性能压力测试中,可能需要我们事先插入数据库中一些相关联的数据. 我们在实际测试中,遇到问题,需 ...