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种方式实现二分查找),栈相关推荐

  1. linux怎么搜索文件几种方式,Linux下查找文件的几种方式

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? ¶Linux下查找文件 Linux中有好几种查找文件的方式,让刚刚接触Linux的小伙伴眼花缭乱,到底该用哪个命令才能准 ...

  2. java实现二分查找-两种方式

    二分查找是一种查询效率非常高的查找算法.又称折半查找.起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来 辅助查询.本文就介绍两种方法二分查找算法思想有 ...

  3. c++创建对象的几种方式

    不通过"new"关键字,在栈上创建 通过关键字"new",在堆上创建 两种方式的区别 在栈中的对象,其作用范围只是在函数内部,函数执行完成后就会调用析构函数,删 ...

  4. 二分查找算法(递归与非递归两种方式)

    首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下 ...

  5. 15 | 二分查找(上):如何用最省内存的方式实现快速查找功能?

    思考题:假设有 1000 万个整数数据,每个数据占 8 个字节,如何设计数据结构和算法,快速判断某个整数是否出现在这 1000 万数据中?希望不要占用太多的内存空间,最多不要超过 100MB 二分思想 ...

  6. java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

  7. python中二分查找什么意思_python中二分查找法的实现方法

    如果想要在有序数据中进行查找想要的数据,二分查找法就个好方法,它可以大大缩短了搜索时间,是一种常见的查找方法.二分查找很好写,却很难写对,下面,小编就简单向大家介绍一下二分查找,并演示器使用代码. 1 ...

  8. python学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例

    文章目录 二分查找 线性查找 插入排序 快速排序 选择排序 冒泡排序 归并排序 堆排序 推荐代码一 推荐代码二 希尔排序 拓扑排序 说明:本篇博文的知识点大部分来自 Python3 实例 二分查找 二 ...

  9. 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找

    第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...

最新文章

  1. Bootstrap3 栅格系统-简介
  2. 将同一列的值用逗号分隔连接成一个字符串
  3. 很不错的Windows 控件 Developer Express Inc.NET
  4. 动态规划--Leetcode121.买卖股票的最佳时机
  5. 人工智障学习笔记——梯度下降(2)优化算法
  6. 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号)...
  7. Faster R-CNN源码中ROI Pooling的解析
  8. android实时声音信号波形_电子设计竞赛教程-信号源类
  9. Atitit recv https req post code 接受https请求// npm install axios// 安装依赖:npm install body-parse
  10. 券商IT的建设一定要有全局观、前瞻性,要走在业务前面,而不是被动响应
  11. hpbios刷新工具_刷新:不会破产的工具
  12. uni-app -- 选择图片、上传图片
  13. 计算机平面设计要学语数英吗,《计算机平面设计与制作》课程标准规范.doc
  14. 职场保护自己利益的技巧,你知道多少?
  15. 深度神经网络之Keras(三)——正则化、超参数调优和学习方向
  16. [转]采用SNMP(简单网络管理协议)实现国税系统广域网络性能管理的研究
  17. 史记十表-卷十六-秦楚之际月表第四
  18. DebugView 简单使用
  19. 2017年上海最新落户政策重磅出炉!你达标了吗?(明年就毕业了希望一切顺利)
  20. 程序人生 - 风冷和水冷散热,怎么选?

热门文章

  1. foreach 实现 MyBatis 遍历集合与批量操作数据
  2. JavaScript实现数乘以二multiplyByTwo算法(附完整源码)
  3. wxWidgets:wxDirDialog类用法
  4. wxWidgets:stream流类概述
  5. boost::multiprecision模块将使用 fixed_int 的算术结果与 GMP 结果进行比较相关的测试程序
  6. boost::mp11::mp_from_sequence相关用法的测试程序
  7. boost::movelib::default_delete相关用法的测试程序
  8. boost::fusion::as_map用法的测试程序
  9. VTK:可视化算法之ExtractData
  10. VTK:图片之Colored2DImageFusion