二分查找(C++实现,递归,非递归)

(本博客旨在个人总结回顾)

一、概念

        二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二、实现

// BinarySearch.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

/*
 * @name   BinarySearchRecursion
 * @brief  二分查找递归实现
 * @param  [in] int * pArray	查找的有序数组(升序)
 * @param  [in] int nBegin		查找数组的起始下标
 * @param  [in] int nEnd		查找数组的结束下标
 * @param  [in] int nKey		查找的目标值
 * @return int	-1为目标数组无nKey值,其他值数组元素值为nKey的下标
 */
int BinarySearchRecursion(int* pArray, int nBegin, int nEnd, int nKey)
{
	if (NULL == pArray || nBegin > nEnd)
	{
		return -1;
	}
	int nMid = (nBegin + nEnd) / 2;
	if (pArray[nMid] == nKey)
	{
		return nMid;
	}
	else if (pArray[nMid] > nKey)
	{
		return BinarySearchRecursion(pArray, nBegin, nMid - 1, nKey);
	}
	else
	{
		return BinarySearchRecursion(pArray, nMid + 1, nEnd, nKey);
	}
}

/*
 * @name   BinarySearchUnrecursion
 * @brief  二分查找非递归实现
 * @param  [in] int * pArray	查找的有序数组(升序)
 * @param  [in] int nBegin		查找数组的起始下标
 * @param  [in] int nEnd		查找数组的结束下标
 * @param  [in] int nKey		查找的目标值
 * @return int	-1为目标数组无nKey值,其他值数组元素值为nKey的下标
 * @return int
 */
 int BinarySearchUnrecursion(int* pArray, int nBegin, int nEnd, int nKey)
{
    if (NULL == pArray || nBegin > nEnd)
    {
        return -1;
    }
    int nMid = -1;
    while (nBegin <= nEnd)
    {
        nMid = (nBegin + nEnd) / 2;
        if (pArray[nMid] == nKey)
        {
            return nMid;
        }

        if (pArray[nBegin] <= nKey && pArray[nMid] > nKey)
        {
            nEnd = nMid - 1;
        }
        else if (pArray[nMid] < nKey && pArray[nEnd] >= nKey)
        {
            nBegin = nMid + 1;
        }
        else
        {
            return -1;
        }

    }
    return -1;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a[10] = {};
	int nLength = sizeof(a) / sizeof(a[0]);
	cout << "升序数组:" << endl;
	for (int i = 0; i < nLength; i++)
	{
		a[i] = i;
		cout << a[i] << "  ";
	}
	cout << endl << "输入查找值:";	
	int nKey = -1;
	cin >> nKey;
	int nIndex = BinarySearchRecursion(a, 0, nLength-1, nKey);
	if (nIndex != -1)
	{
		cout << endl << "数组中有该值,下标为:" << nIndex << endl;
	}
	else
	{
		cout << endl << "数组中无该值" << endl;
	}
	system("pause");
	return 0;
}

执行结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章