如何分別使用遞歸與非遞歸實現二分查找算法


思路分析:

二分查找法也稱為折半查找法,它的思想是每次都與序列的中間元素進行比較。二分查找的一個前提條件是數組是有序的,假設數組array為遞增序列,findData為要查找的數,n為數組長度,首先將n個元素分成個數大致相同的兩半,取array[n/2]與將要查找的值findData進行比較,如果findData等於array[n/2],則找到findData,算法終止;如果findData<array[n/2],則只要在數組array的左半部分繼續搜索findData;如果findData>array[n/2],則只需要在數組array的右半部分繼續搜索即可。這個“左半部分”、“右半部分”的確定,都需要兩個參數:開始標記與結束標記,比如初始狀態時,開始標記為下標0,結束標記為數組長度-1,序列的中間元素下標就是開始標記+結束標記/2。要轉到左半部分的中間元素,僅需要將結束標記改為中間元素下標-1;要轉到右半部分的中間元素,則需要將開始標記改為中間元素下標+1。

切記,對於數組,無論是神馬算法,操作之前的第一步一定是判斷該數組是否存在,比如這樣:

if(array==NULL||len<=0)

    return -1;

對於非遞歸算法,自然是要用到循環了,在循環中開始標記和結束標記不斷改變,循環的判斷條件就是開始標記是否在結束標記之前。若查找成功則返回中間元素標記,若查找失敗則返回-1。所以非遞歸算法需要三個參數:數組起始地址、數組長度以及要查找的數字。

對於遞歸算法,判斷條件是一樣的,在調用自身的過程中,要改變的參數要么是開始標記,要么是結束標記。所以對於遞歸算法,需要四個參數:數組起止地址、要查找的數字、開始標記與結束標記。

代碼如下:

// 1315.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"
#include<stdio.h>
int BinarySearch(int array[], int len, int findData)
{
	if (array == NULL || len <= 0)
		return -1;
	int start = 0;
	int end = len - 1;
	while (start <= end)
	{
		int mid = start + (end - start) / 2;
		if (array[mid] == findData)
			return mid;
		else if (findData < array[mid])
			end = mid - 1;
		else
			start = mid + 1;
	}
	return -1;
}
int BinarySearchRecursion(int array[], int findData, int start, int end)
{
	if (array == NULL || end <= 0)
		return -1;
	if (start>end)
		return -1;
	int mid = start + (end - start) / 2;
	if (array[mid] == findData)
		return mid;
	else if (findData < array[mid])
		return BinarySearchRecursion(array, findData, start, mid - 1);
	else
		return BinarySearchRecursion(array, findData, mid + 1, end);
}
int main()
{
	int array[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	int len = sizeof(array) / sizeof(int);
	int index = BinarySearch(array, len, 4);
	int index2 = BinarySearchRecursion(array, 9,0,len);
	printf("%d\n%d\n", index, index2);
	getchar();
	return 0;
}

  效果如圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM