二分查找(5种方式实现二分查找),栈
1、5种方式实现二分查找,案例结构:
halfFind.h
#ifndef _HALFFIND_
#define _HALFFIND_
/************************************************************************/
/* 初始化长度为L的数组 */
/************************************************************************/
extern void initArray(int *arr, int n);
/************************************************************************/
/* 打印数组 */
/************************************************************************/
extern void printArr(int *arr, int n);
/************************************************************************/
/* 打印次数 */
/************************************************************************/
extern void printTimes(int pos);
/************************************************************************/
/* 通过While循环的方式实现二分查找 */
/************************************************************************/
extern int halfFindByWhile(int *arr, int n, int num);
/************************************************************************/
/* 二分查找查询某个数值,通过do-while */
/************************************************************************/
extern int halfFindByDoWhile(int *arr, int n, int num);
/************************************************************************/
/* 二分查找,通过goto语句实现 */
/************************************************************************/
extern int halfFindByGoto(int *arr, int n, int num);
/************************************************************************/
/* 通过For循环的方式实现二分查找 */
/************************************************************************/
extern int halfFindByFor(int *arr, int n, int num);
/************************************************************************/
/* 通过递归的方式进行查找 */
/************************************************************************/
extern int halfFindByRecursion(int *arr,int n,int num);
#endif
halfFuncs.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "halfFind.h"
/************************************************************************/
/* 初始化数组的值 */
/************************************************************************/
//voidinitArray(int *arr,int n)
//{
// //时间数据类型
// time_t ts;
// unsigned int num = time(&ts);
// //初始化随机数种子
// srand(num);
// for (int i = 0; i < n; i++) {
// arr[i] = rand() % n;
// }
//}
/************************************************************************/
/* 初始化数组的值 */
/************************************************************************/
void initArray(int *arr, int n)
{
for (int i = 0; i < n; i++) {
arr[i] = i;
}
}
/************************************************************************/
/* 打印数组 */
/************************************************************************/
void printArr(int *arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ",arr[i]);
}
}
/************************************************************************/
/* 打印搜索次数 */
/************************************************************************/
void printTimes(int pos) {
printf("\nposition = %d\n",pos);
}
/************************************************************************/
/* 二分查找查询某个数值,通过While表达式 */
/************************************************************************/
int halfFindByWhile(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
while (start_pos <= end_pos)
{
middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
}
if (start_pos > end_pos)
{
printf("\n没有找到\n");
return -1;
}
}
/************************************************************************/
/* 二分查找查询某个数值,通过do-while */
/************************************************************************/
int halfFindByDoWhile(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
do
{
middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
} while (start_pos <= end_pos);
if (start_pos > end_pos)
{
printf("\n没有找到\n");
return -1;
}
}
/************************************************************************/
/* 通过goto语句查找 */
/************************************************************************/
int halfFindByGoto(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
flag:middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
if (start_pos <= end_pos)
{
goto flag;
}
else
{
printf("\n对不起,没有找到!\n");
return -1;
}
}
/************************************************************************/
/* 通过for循环的方式进行查找 */
/************************************************************************/
int halfFindByFor(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
for (; start_pos <= end_pos;)
{
middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
}
if (start_pos > end_pos)
{
printf("\n对不起,没有找到!\n");
return -1;
}
}
/************************************************************************/
/* 通过递归的方式二分查找 */
/************************************************************************/
int recursion(int *arr, int n, int num, int start_pos,int end_pos,int middle_pos)
{
if(start_pos <= end_pos)
{
middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
}
else
{
printf("\n对不起,没有找到!\n");
return -1;
}
recursion(arr, n, num, start_pos, end_pos, middle_pos);
}
/************************************************************************/
/* 通过递归的方式进行二分查找 */
/************************************************************************/
int halfFindByRecursion(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
//接收递归返回来的值
return recursion(arr, n, num, start_pos, end_pos, middle_pos);
}
halfFind.c
#include <stdio.h>
#include <stdlib.h>
#include "halfFind.h"
#define N 45
int main(int argc,char *argv[]){
int arr[N];
//times表示查找了多少次
//start_pos表示开始查找位置
//end_pos最后位置
//num标识要查找的值
int pos;
initArray(arr,N);
//打印数组
printArr(arr, N);
//查找
//1、通过while的方式进行查找
//pos = halfFindByWhile(arr, N, 60);
//2、通过do-while的方式进行查找
//pos = halfFindByDoWhile(arr, N, 60);
//3、通过for循环的方式进行二分查找
//pos = halfFindByGoto(arr,N,30);
//4、通过for循环的方式进行二分查找
//pos = halfFindByFor(arr,N,30);
//5、通过递归的方式实现二分查找
pos = halfFindByRecursion(arr,N,60);
printTimes(pos);
system("pause");
return 0;
}
2、结合结构体实现栈存储结构,代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 50
struct mystack
{
int top;//栈顶
int data[N];//存放数据
};
struct mystack selfstack = { -1, { 0 } };//栈的初始化
//函数声明
int isempty(); //1为空 0非空
void setempty(); //栈设置为空
int push(int num); //压入数据,成功1,失败返回0
int pop(); //弹出数据
/************************************************************************/
/* 判断栈是否为空 */
/************************************************************************/
int isempty()
{
if (selfstack.top == -1)
{
//表示是空的
return 1;
}
else
{
//表示不是空的
return 0;
}
}
/************************************************************************/
/* 将栈设置成为空 */
/************************************************************************/
void setempty()
{
selfstack.top = -1;
}
/************************************************************************/
/* 压入数据,成功返回1,失败返回0 */
/************************************************************************/
int push(int num)
{
//一定要记住:要判断栈是否溢出
if (selfstack.top == N - 1)
{
//压栈失败
return 0;
}
else
{
selfstack.top += 1; //小标移动一下
selfstack.data[selfstack.top] = num;//压入数据
return 1;
}
}
/************************************************************************/
/* 弹出数据 */
/************************************************************************/
int pop()
{
//判断栈是否为空
if (selfstack.top == -1)
{
return -1;//栈为空
}
else
{
selfstack.top -= 1;
return selfstack.data[selfstack.top + 1];//弹出的数据
}
}
int main(int argc, char *argv[])
{
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i = 0;
for (i = 0; i < 10; i++)
{
//填充数据
push(a[i]);
}
while (!isempty())
{
printf("%d\n", pop());//输出数据
}
system("pause");
return 0;
}
二分查找(5种方式实现二分查找),栈相关推荐
- linux怎么搜索文件几种方式,Linux下查找文件的几种方式
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? ¶Linux下查找文件 Linux中有好几种查找文件的方式,让刚刚接触Linux的小伙伴眼花缭乱,到底该用哪个命令才能准 ...
- java实现二分查找-两种方式
二分查找是一种查询效率非常高的查找算法.又称折半查找.起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来 辅助查询.本文就介绍两种方法二分查找算法思想有 ...
- c++创建对象的几种方式
不通过"new"关键字,在栈上创建 通过关键字"new",在堆上创建 两种方式的区别 在栈中的对象,其作用范围只是在函数内部,函数执行完成后就会调用析构函数,删 ...
- 二分查找算法(递归与非递归两种方式)
首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下 ...
- 15 | 二分查找(上):如何用最省内存的方式实现快速查找功能?
思考题:假设有 1000 万个整数数据,每个数据占 8 个字节,如何设计数据结构和算法,快速判断某个整数是否出现在这 1000 万数据中?希望不要占用太多的内存空间,最多不要超过 100MB 二分思想 ...
- java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...
顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...
- python中二分查找什么意思_python中二分查找法的实现方法
如果想要在有序数据中进行查找想要的数据,二分查找法就个好方法,它可以大大缩短了搜索时间,是一种常见的查找方法.二分查找很好写,却很难写对,下面,小编就简单向大家介绍一下二分查找,并演示器使用代码. 1 ...
- python学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例
文章目录 二分查找 线性查找 插入排序 快速排序 选择排序 冒泡排序 归并排序 堆排序 推荐代码一 推荐代码二 希尔排序 拓扑排序 说明:本篇博文的知识点大部分来自 Python3 实例 二分查找 二 ...
- 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找
第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...
最新文章
- Bootstrap3 栅格系统-简介
- 将同一列的值用逗号分隔连接成一个字符串
- 很不错的Windows 控件 Developer Express Inc.NET
- 动态规划--Leetcode121.买卖股票的最佳时机
- 人工智障学习笔记——梯度下降(2)优化算法
- 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号)...
- Faster R-CNN源码中ROI Pooling的解析
- android实时声音信号波形_电子设计竞赛教程-信号源类
- Atitit recv https req post code 接受https请求// npm install axios// 安装依赖:npm install body-parse
- 券商IT的建设一定要有全局观、前瞻性,要走在业务前面,而不是被动响应
- hpbios刷新工具_刷新:不会破产的工具
- uni-app -- 选择图片、上传图片
- 计算机平面设计要学语数英吗,《计算机平面设计与制作》课程标准规范.doc
- 职场保护自己利益的技巧,你知道多少?
- 深度神经网络之Keras(三)——正则化、超参数调优和学习方向
- [转]采用SNMP(简单网络管理协议)实现国税系统广域网络性能管理的研究
- 史记十表-卷十六-秦楚之际月表第四
- DebugView 简单使用
- 2017年上海最新落户政策重磅出炉!你达标了吗?(明年就毕业了希望一切顺利)
- 程序人生 - 风冷和水冷散热,怎么选?
热门文章
- foreach 实现 MyBatis 遍历集合与批量操作数据
- JavaScript实现数乘以二multiplyByTwo算法(附完整源码)
- wxWidgets:wxDirDialog类用法
- wxWidgets:stream流类概述
- boost::multiprecision模块将使用 fixed_int 的算术结果与 GMP 结果进行比较相关的测试程序
- boost::mp11::mp_from_sequence相关用法的测试程序
- boost::movelib::default_delete相关用法的测试程序
- boost::fusion::as_map用法的测试程序
- VTK:可视化算法之ExtractData
- VTK:图片之Colored2DImageFusion