1. 程式人生 > >二分查詢(C++)+遞迴和非遞迴演算法

二分查詢(C++)+遞迴和非遞迴演算法

關於二分查詢法

二分查詢法主要是解決在“一堆數中找出指定的數”這類問題。

而想要應用二分查詢法,這“一堆數”必須有一下特徵:

  • 儲存在陣列中
  • 有序排列

所以如果是用連結串列儲存的,就無法在其上應用二分查詢法了。(曽在面試被問二分查詢法可以什麼資料結構上使用:陣列?連結串列?)

至於是順序遞增排列還是遞減排列,陣列中是否存在相同的元素都不要緊。不過一般情況,我們還是希望並假設陣列是遞增排列,陣列中的元素互不相同。

以下為測試程式:

#include <iostream>

using namespace std;

//非遞迴實現
int BinarySearch(int array[], int len, int value)
{
	if (array == NULL || len <= 0)
		return -1;

	int low = 0;
	int high = len - 1;
	while (low <= high)
	{
		int mid = low + (high - low) / 2;
		if (array[mid] == value)
			return mid;
		else if (array[mid] > value)
			high = mid - 1;
		else
			low = mid + 1;
	}

	return -1;
}
//遞迴實現
int BinarySearch_Recursive(int array[], int low, int high, int value)
{
	if (low > high)
		return -1;
	int mid = low + (high - low) / 2;
	if (array[mid] == value)
		return mid;
	else if (array[mid] > value)
		return BinarySearch_Recursive(array, low, mid - 1, value);
	else
		return BinarySearch_Recursive(array, mid + 1, high, value);

}

int main(int argc, char *argv[])
{
	int i, j;
	int arr[10];
	for (i = 0; i < 10; i++)
	{
		arr[i] = i * 2;
	}
	cout << "Input the search number:";
	cin >> j;
	int location  = BinarySearch(arr, 10, j);
	if (location != -1)
		cout << "Exist1:" << location << endl;
	else
		cout << "Not existed in array!" << endl;
	location = BinarySearch_Recursive(arr, 0, 9, j);
	if (location != -1)
		cout << "Exist2:" << location << endl;
	else
		cout << "Not existed in array!" << endl;
	system("pause");
	return 0;
}


相關推薦

二分查詢(C++)+演算法

關於二分查詢法 二分查詢法主要是解決在“一堆數中找出指定的數”這類問題。 而想要應用二分查詢法,這“一堆數”必須有一下特徵: 儲存在陣列中 有序排列 所以如果是用連結串列儲存的,就無法在其上應用二分查詢法了。(曽在面試被問二分查詢法可以什麼資料結構上使用:陣列?連結

二分查詢實現(c語言實現)

#include<stdio.h>++ int seeqSearch(int a[],int n,int k){     int i=n-1;     for(;i>=0;i--){//遍歷陣列         if(a[i]==k){//找到對應的陣列

C語言:實現二分查詢

二分查詢是將有序數列不斷地縮小,直到找到改元素或折半區域的首元素位置高於尾元素位置為止。//遞迴寫二分查詢 int BinarySearchD(int arr[], int x, int begin,

[C語言]用的方法在楊氏矩陣中查詢

從楊氏矩陣中查詢數字,以及調整奇數位於陣列的前半部分 //從楊氏矩陣中查詢數字 //1.從右上角開始找,如果要找的值大於當前值,向下找,否則,向左找,方向確定 //2.從左下角開始找,如果要找的值大於當前值,向右找,否則,向上找,方向確定 //---->最

JAVA實驗二:編碼實現一個類對輸入陣列的數從小到大排序同時使用二分查詢某一個數(

編碼實現一個類 (1)提供一個靜態方法,可以將輸入的一個int[]陣列按照從小到大的順序排列; (2)提供靜態方法,對排好序的陣列使用折半(二分)查詢(使用遞迴和非遞迴兩種形式分別實現)查詢某一個整數。 答案 import java.util.*; public class

Java(二分查詢演算法實現,分別使用方式)

public class BinarySearch { private int[] array; private int index; private int min; private int max; public BinarySearch(int[]

二分查詢 java實現

public static int rank(int []a , int x, int lo, int hi) { if(hi<lo) return -1; if(a[lo+(hi-lo)/2]>x) return rank(a,x,lo,lo+(hi-lo)/2-1);

二分查詢法(實現)

二分查詢法:      二分查詢法又稱折半查詢法,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。(借鑑百度百科)時間複雜度為:log2n,即log以2為底,n的對數。     

資料結構用方法實現二分查詢

       二分查詢法說的通俗一點就是折半查詢,每查詢一次,所對應的元素就會減少一半,所以這種方法的優點就是比較的次數少,查詢的速度快。但其最大的缺點就是插入資料比較困難。所以在面對資料一直會發生變動的列表,就不推薦用二分查詢法了。        那麼下面就來實際介紹一下

練習題013:二分查詢兩種方法)

題目:用遞迴和非遞迴兩種方法實現二分查詢 非遞迴法: int binary_search(int *arr, int lenth, int key) { assert(arr != NU

(一)演算法--查詢演算法順序查詢二分查詢方式)

我們拋開二分查詢演算法,如果有這樣的一個需求,需要在一些數字中找出有沒有某個數字,我們應該怎麼做?          1 首先我們會想到用什麼資料結構存放這些數? 資料結構就是計算機儲存組織、

二叉樹的前序,中序,後序的遍歷的程式碼-C語言

#include <stdio.h> #include<stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input l

楊氏矩陣查詢數字(

楊氏矩陣  有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在。 要求:時間複雜度小於O(N);  例:  1 2 3          4 5 6  

c++二叉樹的的前序中序後序遍歷以及層序遍歷

二叉樹的遞迴版的前序,中序和後序遍歷很簡單也很容易理解,這裡就放一個前序遍歷的例子 //前序遍歷遞迴演算法,遞迴演算法都大同小異,這裡就不一一列舉了 void binaryTree::pro_order(NodeStack::Node *t) { NodeStack::Node *h = t;

C語言:分別實現求n的階乘

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "stdlib.h" #include<stdio.h> //遞迴方法實現N的階乘 int fac1(int n

二叉樹中序遍歷(演算法C語言實現

二叉樹中序遍歷的實現思想是: 訪問當前節點的左子樹; 訪問根節點; 訪問當前節點的右子樹; 圖 1 二叉樹   以圖  1 為例,採用中序遍歷的思想遍歷該二叉樹的過程為: 訪問該二叉樹的根節點,找到 1; 遍歷節點 1 的左子樹,找到節點 2; 遍歷節點 2 的左子樹,找到節點 4;

全排列的實現(permutation)(C++)

全排列問題 以下是C++程式碼實現: //Permutation1 和 permutation2 分別是基於遞迴和非遞迴的實現,都可以實現去除重複的排列 //讀者也可以自己提交之後到leet

c/c++英文句子中單詞逆置(實現)

遞迴實現: #include <iostream> using namespace std; void change() { char str[1024] = {0}; if (scanf("%s", str) != EOF) { change(); } el

C語言二叉樹的遍歷,

程式碼包含如下幾個檔案: 下面一一貼出來: Stack.h檔案: #ifndef STACK_H_ #define STACK_H_ #include "BinaryTree.h" #include <stdbool.h> #define STACK_INI

[c語言]用求第n個斐波那契數

程式碼 //1.1遞迴求第n個斐波那契數 #include<stdio.h> int fib(int n) { if(n<=2) return 1; else return fib(n-1)+fib(n-2); } int main