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

執行結果:

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