二分查找(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

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;

}

 

 

 

时间: 2025-01-21 12:41:01

二分查找(5种方式实现二分查找),栈的相关文章

Facebook 目前正在内测一种新的快速查找好友的功能

Facebook 目前正在内测一种新的快速查找好友的功能,该功能被 Facebook 称作"Shortcut". Facebook 将为每位用户提供一个专属的 8位数号码,通过这个号码,用户在搜索某位特定的好友时,不再需要通过其名字进行搜索,只需输入对应的 8位数就可以了. 目前该功能仍在内测阶段,只开放给部分用户使用. 数字尽管在移动端输入比名字简单,但这需要你"额外"记住对应好友的 8位数号码,如果该数字号码的使用场景有限,仅用于找到好友,个人认为,新功能给用户

Javascript学习总结:Js继承的两种方式

文章简介:总结就是利用对象冒充机制的call方法把父类的属性给抓取下来,而成员方法尽量写进被所有对象实例共享的prototype域中,以防止方法副本重复创建.然后子类继承父类prototype域来抓取下来所有的方法.如想彻底理清这些调用链的关系,推荐大家多关注Js中prototype的constru 一直想对Javascript再次做一些总结,正好最近自己写了一个小型Js UI库,总结了一下Js的继承机制,在网上也看了一些前辈们博客里的总结,感觉分析不是特别全面.这里仅仅是把自己的学习体会拿出来

JS获取html对象的几种方式介绍

 这篇文章主要介绍了JS获取html对象的几种方式,有需要的朋友可以参考一下 document.getElementById("zx");   通过ID获取html元素对象,ID号在html文档当中应该是唯一的.返回的是唯一element对象.并且所有浏览器都兼容.   document.getElementsByTagName("span")[0];   通过标签查找html对象,由于html标签在一个页面中可能重复很多次,所以当前页面返回的是一个数组.可以根据标

Jquery 获取对象的几种方式介绍

  本文为大家介绍下Jquery如何获取对象有哪几种方式,感兴趣的朋友可以参考下 1.JQuery的核心的一些方法 each(callback) '就像循环 $("Element").length; '元素的个数,是个属性 $("Element").size(); '也是元素的个数,不过带括号是个方法 $("Element").get(); '某个元素在页面中的集合,以数组的形式存储 $("Element").get(inde

查询json的数据结构的8种方式介绍

 你有没有对"在复杂的JSON数据结构中查找匹配内容"而烦恼,这篇文章介绍了查询json的数据结构的8种方式,总有一个适合你项目使用的方法 查询json的数据结构的8种方式:   JsonSQL   JsonSQL实现了使用SQL select语句在json数据结构中查询的功能.主页:http://www.trentrichardson.com/jsonsql/   例子:    代码如下: jsonsql.query("select * from json.channel.

c语言-C语言system函数打开文件的几种方式的不同

问题描述 C语言system函数打开文件的几种方式的不同 用c语言的system函数打开一个文件,system("cmd /c start out.txt")和system("out.txt")都可以,请问这两个有什么区别 解决方案 C:>start /? 启动另一个窗口运行指定的程序或命令. START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW |

数据库拆分的几种方式

数据库做拆分的几种方式:1.按功能划分(垂直切分) 将不同功能相关的表放到不同的数据库中,这样做的好处是非常直观.但当某一部分的功能其数据量或性能要求超出了可控的范围,就需要继续对其进行深入的再切分. 2.按表中某一字段值的范围划分(水平切分) 当伴随着某一个表的数据量越来越大,以至于不能承受的时候,就需要对它进行进一步的切分.一种选择是根据key 的范围来做切分,譬如ID 为 1-10000的放到A上,ID 为10000~20000的放到B.这样的扩展就是可预见的.另一种是根据某一字段值来划分

ODM规则执行服务器RES支持热部署的两种方式

规则集的热部署是指在规则集版本发生变化时,规则执行组件 (XU) 可以自动接收到规则集版本更新的通知 , 从而自动加载最新的规则集,整个过程用户不需要重启任何组件.业务规则管理系统实现了业务规则和应用程序逻辑的分离,业务用户可以在业务逻辑放生变化时,即时的更新业务规则,部署最新的规则集到规则执行服务器.而规则集的热部署则保证了在业务逻辑发生变化时,业务规则管理http://www.aliyun.com/zixun/aggregation/18477.html">系统服务的连续性. ODM

详解iOS获取通讯录的4种方式_IOS

本文实例为大家分享了iOS获取通讯录的4种方式,供大家参考,具体内容如下 使用场景 一些App通过手机号码来推荐好友,如 微博.支付宝 首先客户端会获取通讯录中的所有手机号然后将这些手机号提交到App服务器中,服务器会查找每个手机号对应的App账号如QQ号码返回到客户端,然后客户端根据服务器返回的账号列表来推荐好友. 获取联系人方式 方案一:AddressBookUI.framework框架 提供了联系人列表界面.联系人详情界面.添加联系人界面等 一般用于选择联系人 方案二:AddressBoo