1. 程式人生 > >二分查詢(遞迴與非遞迴方式)

二分查詢(遞迴與非遞迴方式)

@Test
	public void testBinarySearch() {
		int[] arr = { 1, 2, 3, 4, 5 };
		// 非遞迴實現,返回對應的序號
		System.out.println(BinarySearch(arr, 5));
		// 遞迴實現,返回對應的序號
		System.out.println(BinSearch(arr, 5));
	}

	/**
	 * 非遞迴實現,返回對應的序號
	 * 
	 * @author: kpchen
	 * @createTime: 2015年1月6日 下午8:21:55
	 * @history:
	 * @param arr
	 *            陣列
	 * @param key
	 *            查詢數
	 * @return int 返回位置
	 */
	int BinarySearch(int[] arr, int key) {
		if (arr == null || arr.length < 1) {
			return -1;
		}

		int low = 0;
		int high = arr.length - 1;
		while (low <= high) {
			int mid = (low + high) / 2;
			if (key == arr[mid]) {
				return mid;
			} else if (key < arr[mid]) {
				high = mid - 1;
			} else {
				low = mid + 1;
			}
		}
		return -1;
	}

	/*
	 * 遞迴實現,返回對應的序號
	 */
	int BSearch(int[] arr, int low, int high, int key) {
		if (arr == null || low > high) {
			return -1;
		}

		int mid = (low + high) >> 1;
		if (arr[mid] == key) {
			return mid;
		} else if (arr[mid] > key) {
			return BSearch(arr, low, mid - 1, key);
		} else {
			return BSearch(arr, mid + 1, high, key);
		}
	}

	/*
	 * 將遞迴實現的方法封裝起來
	 */
	int BinSearch(int[] arr, int key) {
		return BSearch(arr, 0, arr.length - 1, key);
	}

相關推薦

二分查詢演算法兩種方式

首先說說二分查詢法。 二分查詢法是對一組有序的數字中進行查詢,傳遞相應的資料,進行比較查詢到與原資料相同的資料,查詢到了返回對應的陣列下標,沒有找到返回-1; 如下示例,其中有序陣列中, 是按照從小到

二分查詢方式

@Test public void testBinarySearch() { int[] arr = { 1, 2, 3, 4, 5 }; // 非遞迴實現,返回對應的序號 System

# 二分查詢實現

二分查詢的遞迴與非遞迴實現 二分查詢也稱為折半查詢,首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果

二叉搜尋樹的查詢、插入、刪除的實現C語言

【概念】 什麼是二叉搜尋樹? 二叉搜尋樹又稱二叉排序樹(按照中序遍歷,可以得到一組有序的序列),它或者是一顆空樹,或者是具有以下性質的二叉樹: 若他的左子樹不為空,則左子樹上所有節點的值都小於根結點的值。 若他的

樹的前、中、後序遍歷演算法、層序遍歷

二叉樹層次遍歷 非遞迴 void LevelOrder(Tree* T) { if(T == nullptr) return ; queue<Tree *> myqueue; myqueue.push(T); while(!myqueu

斐波那契

遞迴 long jumpFloor(int number) { if(number <= 0) return 0; else if(number == 1 ) return 1; return jumpFloor(number-1)

斐波那契數列

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 1e2+10; ll a[MAXN]; ll F[MAXN]; ll f(ll n) ///遞迴 { if

n的階乘

#include <bits/stdc++.h> using namespace std; typedef long long ll; ll f(ll n)///遞迴演算法 { if(n==0 || n==1) return 1; else return n * f

後續遍歷--java版

先訪問左右孩子,再訪問根節點。同樣還是採用棧的形式,但是問題是,先訪問左孩子出棧,根節點不能刪除,再訪問右孩子出棧,最後訪問根節點出棧。我們的思路是這樣的: 對於某個節點p:    1)將p壓入棧中,並將p所有的左孩子,全部壓入棧中: while(stk.

二叉樹深度Depth````

二叉樹 (`Depth`)遞迴 深度優先遍歷 DFS 二叉樹的高度(深度)為二叉樹結點層次的最大值,也可以認為在根節點不為 nullptr 的情況下左右子樹的最大高度 + 1; 先序(後序)遍歷求解二叉樹高度(Depth)的遞迴演算法 演算法描述:深度優先遍歷 

楊輝三角的C語言實現

本文用C語言程式碼實現楊輝三角 遞迴演算法依據於f(m,n)=f(m-1,n)+f(m-1,n-1) 其中(m,n)為楊輝三角第m行第n個元素 演算法程式碼如下:   #include <stdio.h> //遞迴函式 int func(int m,in

二叉樹後序遍歷演算法及C語言實現

二叉樹後序遍歷的實現思想是:從根節點出發,依次遍歷各節點的左右子樹,直到當前節點左右子樹遍歷完成後,才訪問該節點元素。 圖 1 二叉樹   如圖 1 中,對此二叉樹進行後序遍歷的操作過程為: 從根節點 1 開始,遍歷該節點的左子樹(以節點 2 為根節點); 遍歷節點 2 的左子樹(以節點 4 為根

二叉樹先序遍歷及C語言實現

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

二叉樹前,中,後遍歷

#include<stdio.h> #include<stdlib.h> typedef struct node { char data; struct node *lchild,*rchild; }bintnode; typedef struct

二叉樹的前序,中序,後序,層次遍歷方式

以前在學校學過二叉樹的遍歷,工作後基本上沒用到,現在整理下這幾種排序演算法: 1.java的測試方法: package leetcode.TestList; /** * @author zhangyu * @version V1.0 * @ClassName: TreeNode *

Java排序演算法(三)--歸併排序MergeSort的實現

歸併有遞迴和非遞迴兩種。 歸併的思想是: 1.將原陣列首先進行兩個元素為一組的排序,然後合併為四個一組,八個一組,直至合併整個陣列; 2.合併兩個子陣列的時候,需要藉助一個臨時陣列,用來存放當前的

資料結構——二叉樹的遍歷先序,中序,後序

實驗專案五 二叉樹基本操作的實現 課程名稱:資料結構 實驗專案名稱:二叉樹基本操作的實現 實驗目的: 1.掌握樹的基本操作—遍歷。 實驗要求: 1、 分別用遞迴和非遞迴的方法實現一棵樹的三種遍歷。 實驗過程: 建立一棵二叉樹(二叉樹如下圖所示);

筆記九:二叉樹的建立、版前序、中序、後序查詢、樹高和節點判斷

程式碼: #include<iostream> #include<vector> #include<stack> using namespace std; template<typename T> str

深度優先搜尋DFS實現邏輯詳解

 遞迴與非遞迴:        資料結構對於學習程式設計的人來說是非常重要的,我們在現實生活碰到的各種煩難問題可以用遞迴來實現,一個遞迴思想就把問題給簡單化了,但是我們都知道遞迴是非常耗時的,一旦資料量龐大起來,遞迴

樹的遍歷版本

樹的遍歷 題目要求 要求4個函式分別按照訪問順序打印出結點的內容,格式為一個空格跟著一個字元。 #include <stdio.h> #include <stdlib.h> typedef char ElementType