二分法的五种实现

while的实现

#include<iostream>
using namespace std;
void whilee1(int *a,int shang,int xia,int num)//
{
    cout << "shang	zhong	xia	 " << endl;
    while (shang >=xia)//如果把序号大的看作上面用shang > xia,序号小的看作上面用xia<shang
    {
        int zhong = (shang + xia) / 2;
        cout << shang << "	" << zhong << "	" << 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	zhong	xia	 " << endl;
    while (shang<=xia)//如果把序号大的看作上面用shang >= xia,序号小的看作上面用xia<shang
    {
        int zhong = (shang + xia) / 2;
        cout << shang << "	" << zhong << "	" << 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	zhong	xia	 " << endl;
	do
	{
		zhong = (shang + xia) / 2;
		cout << shang<<"	"<<zhong<<"	"<<xia<<"	 " << 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	zhong	xia	 " << endl;
	do
	{
		zhong = (shang + xia) / 2;
		cout << shang << "	" << zhong << "	" << xia << "	 " << 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	zhong	xia	" << endl;
	for (zhong = (shang + xia) / 2; shang >= xia;zhong=(shang+xia)/2)
	{
		cout << shang<<"	"<<zhong<<"	"<<xia<<"	" << 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	zhong	xia	" << endl;
	A: int zhong = (shang + xia) / 2;
		cout << shang << "	" << zhong << "	" << xia << "	" << 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 << "	" << zhong << "	" << 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;
	}
}

  

原文地址:https://www.cnblogs.com/bkcarlos/p/4654991.html