(本博客旨在個人總結回顧)
一、概念
二分查找也稱折半查找(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;
}
執行結果: