二分法的五种实现

while的实现

#include<iostream>
using namespace std;
void whilee1(int *a,int shang,int xia,int num)//
{
    cout << "shang\tzhong\txia\t " << endl;
    while (shang >=xia)//如果把序号大的看作上面用shang > xia,序号小的看作上面用xia<shang
    {
        int zhong = (shang + xia) / 2;
        cout << shang << "\t" << zhong << "\t" << xia << endl;
        if (num == a[zhong])
        {
            cout << "whilee1 find" << endl;
            break;
        }
        else if (a[zhong]<num)
        {
            xia = zhong + 1;

        }
        else  //(num<zhong)
        {
            shang = zhong - 1;
        }

    }
    if (xia >shang)
    {
        cout << "while1 not find " << endl;
    }
}
void whilee2(int *a, int xia, int shang, int num)
{
    cout << "shang\tzhong\txia\t " << endl;
    while (shang<=xia)//如果把序号大的看作上面用shang >= xia,序号小的看作上面用xia<shang
    {
        int zhong = (shang + xia) / 2;
        cout << shang << "\t" << zhong << "\t" << xia << endl;
        if (num == a[zhong])
        {
            cout << "whilee2 find" << endl;
            break;
        }
        else if (a[zhong]<num)
        {
            shang = zhong + 1;

        }
        else  //(num<zhong)
        {
            xia = zhong - 1;
        }

    }
    if (shang>xia)
    {
        cout << "while2 not find " << endl;
    }

}

dowhile的实现#include<iostream>
using namespace std;
void dowhile1(int *a,int shang,int xia,int num)
{
	int zhong;
	cout << "shang\tzhong\txia\t " << endl;
	do
	{
		zhong = (shang + xia) / 2;
		cout << shang<<"\t"<<zhong<<"\t"<<xia<<"\t " << endl;
		if (num == a[zhong])
		{
			cout << "dowhile1 find" << endl;
			break;
		}
		else if (num > a[zhong])
		{
			xia = zhong + 1;
		}
		else {
			shang = zhong - 1;
		}
	} while (shang >= xia);
		if (xia >shang) {
			cout << "dowhile1 not fid" << endl;
		}
}
void dowhile2(int *a, int xia, int shang, int num)
{
	int zhong;
	cout << "shang\tzhong\txia\t " << endl;
	do
	{
		zhong = (shang + xia) / 2;
		cout << shang << "\t" << zhong << "\t" << xia << "\t " << endl;
		if (num == a[zhong])
		{
			cout << "dowhile2 find" << endl;
			break;
		}
		else if (num > a[zhong])
		{
			shang = zhong + 1;
		}
		else {
			xia = zhong - 1;
		}
	} while (xia>=shang);
	if (shang>xia) {
		cout << "dowhile2 not fid" << endl;
	}
}

  for的实现

#include<iostream>
using namespace std;
void forr(int *a, int shang, int xia, int num)
{
	int zhong;
	cout << "shang\tzhong\txia\t" << endl;
	for (zhong = (shang + xia) / 2; shang >= xia;zhong=(shang+xia)/2)
	{
		cout << shang<<"\t"<<zhong<<"\t"<<xia<<"\t" << endl;
		if (num==a[zhong])
		{
			cout << "for find" << endl;
			break;
		}
		else if (num > a[zhong])
		{
			xia = zhong + 1;
		}
		else
		{
			shang = zhong - 1;
		}
	}
	if (xia > shang)
	{
		cout << "for not find" << endl;
	}
}

  goto的实现

#include<iostream>
using namespace std;
void gotoo(int *a, int shang, int xia, int num)
{
	if (shang >= xia)
	{
		cout << "shang\tzhong\txia\t" << endl;
	A: int zhong = (shang + xia) / 2;
		cout << shang << "\t" << zhong << "\t" << xia << "\t" << endl;
		if (num == a[zhong])
		{
			cout << "goto find" << endl;
		}
		else if (num > a[zhong])
		{
			if (shang > xia)
			{
				xia = zhong + 1;
				goto A;
			}
			goto B;
		}
		else //(num < a[zhong])
		{
			if (shang > xia)
			{
				shang = zhong - 1;
				goto A;
			}
		}
	}
	 if(shang<xia)
	{
	B:cout << "goto not find" << endl;
	}
}

  递归的实现

#include<iostream>
using namespace std;
void recurrence(int *a, int shang, int xia, int num)
{
	if (shang >=xia)
	{
		int zhong = (shang + xia) / 2;
		cout << shang << "\t" << zhong << "\t" << xia << endl;
		if (num == a[zhong])
		{
			cout << "recurrence find" << endl;
		}
		else if (num > a[zhong])
		{

			recurrence(a, shang, zhong + 1, num);
		}
		else {

			recurrence(a, zhong - 1, xia, num);
		}
	}
	else
	{
		cout << "recurrence not find" << endl;
	}
}

  

时间: 2024-10-11 05:00:26

二分法的五种实现的相关文章

Meteor 中的代码包有点特殊,分为五种

Meteor 中的代码包有点特殊,分为五种: Meteor 核心代码本身分成多个核心代码包(core package),每个 Meteor 应用中都包含,你基本上不需要花费精力来维护它们 常规 Meteor 代码包称为"isopack",或同构代码包(isomorphic package,意味着它们既能在客户端也能在服务器端工作).第一类代码包例如 accounts-ui 或 appcache 由 Meteor 核心团队维护,与 Meteor 捆绑在一起. 第三方代码包就是其他用户开发

五种方式让你在java中读取properties文件内容不再是难题

一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC+Mybatis整合开发的项目中通过java程序读取properties文件内容的方式进行了梳理和分析,先和大家共享. 二.项目环境介绍 Spring 4.2.6.RELEASE SpringMvc 4.2.6.RELEASE Mybatis 3.2.8 Maven 3.3.9 Jdk 1.7 Id

Unix网络编程中的五种I/O模型_转

转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描述符.接受数据缓冲地址.大小传递给内核,但是如果此时 该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡(阻塞)在这里,知道数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空 间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图: 2. 非阻塞I/O模

java线程五种状态

java线程五种状态: 创建 -> 就绪 -> 运行 -> 销毁 创建 -> 就绪 -> 运行 -> 等待(缺少资源) -> 销毁 下图:各种状态转换

js五种设计模式说明与示例

第一种模式:js工厂模式 var lev=function(){         return "啊打";      };      function Parent(){             var  Child = new Object();             Child.name="李小龙";             Child.age="30";             Child.lev=lev;           retur

五种常见的 PHP 设计模式

内容 设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 "四人帮").所介绍的设计模式背后的核心概念非常简单.经过多年的软件开发实践,Gamma 等人发现了某些具有固定设计的模式,就像建筑师设计房子和建筑物一样,可以为浴室的位置或厨房的构造方式开发模板.使用这些模板或者说设计模式 意味着可以更快地设计更好的建筑物.同样的概念也适用于软件. 设计模式不仅代

Linux下的五种IO模型

5种IO模型 Linux下五种IO模型 (1)阻塞I/O:什么都不干,导致应用程序阻塞,等待数据准备好,如果数据没有准备好,一直阻塞,等数据准备好了从内核拷贝到用户空间 (2)非阻塞I/O:把一个套接字接口设置为非阻塞,告诉内核,当所请求的IO无法完成时,不要将进程睡眠,而是返回一个错误,这样IO操作函数会不断地测试数据是否准备好,如果没有准备好 ,继续测试,直到准备好为止 (3)I/O复用(select epoll):select或epoll会使进程阻塞,但是和阻塞IO不同的是,这两个函数可以

android五种数据存储方式

在Android中提供了如下五种数据存储方式: SharedPreferences 文件存储 SQLite数据库方式 内容提供器(ContentProvider) 网络存储 下面具体介绍一下这五种数据存储方式的用法. 1. SharedPreferences SharedPreferences是android平台上的一个轻量级存储类,主要保存一些常用的配置信息.可以保存long.int.String类型数据. SharedPreferences以键值对方式读取和存入,最终会以XML方式保存数据,

android五种布局模式

Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:LinearLayout (线性布局),FrameLayout(框架布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局). 一. 线性布局 线性布局.每一个LinearLayout里面又可分为垂直布局(android:orientation="vertical")和水平布局(android:orientation="