自学算法第一天 ----查找

1.前言:

主要是看《算法》

2.二分查找:

引入:

现在需要从书架(图书管理员已经排好顺序)中查找一本书,你需要设计一个方法来以最快的速度找到。

 方法一:

一向聪明的小张率先给出了答案,是这样的

首先直接从第一本书开始找根据首字母找到对应的首字母后  再根据书名进行寻找

在这里我们定义第一个首字母为 a 最后一个是 z 需要找的那个书是x  书架书组成的集合为a[ ];

 程序 find_book(a,z,x)

输入 输出 ————与 find_book 输入 输出 相同

1.将i赋值为a 将 n 赋值为z

2.只要 a[i] ! = x  ,  则将  i  加  1 

3.当出现 a[i] ==  x 时就意味着 找到了

4.如果没找到  ( i >= n ) 返回not-find;

代码实现 

#include<stdio.h>//假如书名 为 数字 寻找为5 的数 
#define N 10 //长度为10 
int main(){
	int i=0,n=9,a[N]={1,2,3,4,5,6,7,8,9,10},x=5;//因为是数组所以 下标是从0开始
	for(i;i<n;i++)
	{
		if(a[i]==x)
		{
			printf("find");
			break;
		 } 
	 } 
	 if(i==n)
	 printf("not find");	
} 

 

 分析:

小张的方法是一种线性的查找方法 最好的情况下 被寻找的 元素在第一位 只需要循环一次便可以找到 但是当 被寻找的元素位于最后一位时则需要遍历完整个数组来寻找 元素 当数组只有10个元素时或许没什么影响 但是当数组长度到达 1000 这样很长的长度时则需要从 第一位 一直找到 第1000 位 元素 ,因此最坏的情况下 需要循环很多次

方法二

这时候小刘想出来了新方法:

首先将寻找 中间位置 看被寻找的数在左边还是右边 一直以此类推

 在这里我们定义第一个首字母为 a 最后一个是 z  中间值是 mid 需要找的那个书是x  书架书组成的集合为a[ ];

 程序 find_book(a,z,x,mid)

输入 输出 ————与 find_book 输入 输出 相同

1.将 i 赋值为a 将 n 赋值为z mid 赋值为 a+z / 2

2.看 a[mid]是否等于被寻找数X 如果是则结束 并输出 

   如果不是 当 a[mid] < x 时表示在右侧 i = mid+1

                  当 a[mid] >x 时表示在左侧 n = mid-1

4.  循环结束后如果没找到  ( i >= n ) 返回not-find;

 代码实现 

#include<stdio.h>//假如书名 为 数字 寻找为5 的数 
#define N 10 //长度为10 
int main(){
	int i=0,n=9,mid,a[N]={1,2,3,4,5,6,7,8,9,10},x=1;//因为是数组所以 下标是从0开始
	while(i<=n)
	{
	mid=i+n/2;
		if(a[mid]<x){
			i=mid+1;
		} 
		else if(a[mid]>x)
		n=mid-1;
		else if(a[mid]==x)
		{
			printf("find");
			return 0;
		 } 
	 } 
	 printf("not find");	
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值