- 使用 Java 的 DSA 教程
- 使用 Java 進行 DSA - 主頁
- 使用 Java 進行 DSA - 概覽
- 使用 Java 進行 DSA - 環境設定
- 使用 Java 進行 DSA - 演算法
- 使用 Java 進行 DSA - 資料結構
- 使用 Java 進行 DSA - 陣列
- 使用 Java 進行 DSA - 連結串列
- 使用 Java 進行 DSA - 雙向連結串列
- 使用 Java 進行 DSA - 迴圈連結串列
- 使用 Java 進行 DSA - 堆疊
- DSA - 解析表示式
- 使用 Java 進行 DSA - 佇列
- 使用 Java 進行 DSA - 優先順序佇列
- 使用 Java 進行 DSA - 樹
- 使用 Java 進行 DSA - 雜湊表
- 使用 Java 進行 DSA - 堆
- 使用 Java 進行 DSA - 圖
- 使用 Java 進行 DSA - 搜尋技術
- 使用 Java 進行 DSA - 排序技術
- 使用 Java 進行 DSA - 遞迴
- 使用 Java 進行 DSA 的有用資源
- 使用 Java 進行 DSA - 快速指南
- 使用 Java 進行 DSA - 有用資源
- 使用 Java 進行 DSA - 討論
使用 Java 進行 DSA - 二分搜尋
概覽
二分搜尋是一種非常快速的搜尋演算法。此搜尋演算法遵循分而治之的原理。為了正確執行此演算法,資料收集應以排序形式。
二分搜尋透過比較集合的中間項搜尋特定項。如果匹配,則返回該項的索引。如果中間項大於項,則在中間項右邊的子陣列中搜索該項,否則在中間項左邊的子陣列中搜索該項。此過程也將繼續進行子陣列,直到子陣列的大小減小到零。
二分搜尋將可搜尋項減半,從而將所需的比較次數減少到非常少。
演算法
Binary Search ( A: array of item, n: total no. of items ,x: item to be searched) Step 1: Set lowerBound = 1 Step 2: Set upperBound = n Step 3: if upperBound < lowerBound go to step 12 Step 4: set midPoint = ( lowerBound + upperBound ) / 2 Step 5: if A[midPoint] < x Step 6: set lowerBound = midPoint + 1 Step 7: if A[midPoint] > x Step 8: set upperBound = midPoint - 1 Step 9 if A[midPoint] = x go to step 11 Step 10: Go to Step 3 Step 11: Print Element x Found at index midPoint and go to step 13 Step 12: Print element not found Step 13: Exit
演示程式
package com.tutorialspoint.simplesearch;
import java.util.Arrays;
public class BinarySearchDemo {
public static void main(String args[]){
int[] sourceArray = {1,2,3,4,6,7,9,11,12,14,15,
16,17,19,33,34,43,45,55,66,76,88};
System.out.println("Input Array: " +Arrays.toString(sourceArray));
printline(50);
// find location of 55
int location = find(sourceArray, 55);
if(location != -1){
System.out.println("Element found at location: " +(location+1));
}else {
System.out.println("Element not found.");
}
}
public static int find(int[] intArray, int data){
int lowerBound = 0;
int upperBound = intArray.length -1;
int midPoint = -1;
int comparisons = 0;
int index = -1;
while(lowerBound <= upperBound){
System.out.println("Comparison " + (comparisons +1) ) ;
System.out.println("lowerBound : "+lowerBound
+ " , intArray[" + lowerBound+"] = "
+ intArray[lowerBound]) ;
System.out.println("upperBound : "+upperBound
+ " , intArray[" + upperBound+"] = "
+ intArray[upperBound]) ;
comparisons++;
// compute the mid point
midPoint = (lowerBound + upperBound) / 2;
// data found
if(intArray[midPoint] == data){
index = midPoint;
break;
}
else {
// if data is larger
if(intArray[midPoint] < data){
// data is in upper half
lowerBound = midPoint + 1;
}
// data is smaller
else{
// data is in lower half
upperBound = midPoint -1;
}
}
}
System.out.println("Total comparisons made: " + comparisons);
return index;
}
public static void printline(int count){
for(int i=0;i <count-1;i++){
System.out.print("=");
}
System.out.println("=");
}
}
如果我們編譯並執行上述程式,它將產生以下結果
Input Array: [1, 2, 3, 4, 6, 7, 9, 11, 12, 14, 15, 16, 17, 19, 33, 34, 43, 45, 55, 66, 76, 88] ================================================== Comparison 1 lowerBound : 0 , intArray[0] = 1 upperBound : 21 , intArray[21] = 88 Comparison 2 lowerBound : 11 , intArray[11] = 16 upperBound : 21 , intArray[21] = 88 Comparison 3 lowerBound : 17 , intArray[17] = 45 upperBound : 21 , intArray[21] = 88 Comparison 4 lowerBound : 17 , intArray[17] = 45 upperBound : 18 , intArray[18] = 55 Comparison 5 lowerBound : 18 , intArray[18] = 55 upperBound : 18 , intArray[18] = 55 Total comparisons made: 5 Element found at location: 19
廣告