1. 程式人生 > >順序檢索與二分檢索

順序檢索與二分檢索

排序檢索和二分檢索

首先介紹第一種,使用者輸入要查詢的數字,然後在已知數組裡進行查詢,並測出查詢所需要的時間
順序檢索演算法

package joe;	
		import java.util.Arrays;
		import java.util.Scanner;
		public class paixu {
			public static class Jiansuo{
		        public static void main(String[] arg) {
		            //開始時間
		            long startTime = System.currentTimeMillis();
		            int count = 0;
		            //提前設定已知陣列的內容
		            int[] arr = {1,2,3,4,5,6,7,8,9,10,11};
		            System.out.println("\n請輸入一個數字:");
		            //獲取輸入的數
		            Scanner scanner = new Scanner(System.in);
		            int num = scanner.nextInt();
		            //呼叫sequenSearch()方法,將返回值儲存在result中
		            int result = sequenSearch(arr, num);
		            if(result == 0){
		                System.out.println("查詢失敗");
		                System.out.println("查詢次數為"+arr.length);
		            }else{
		                System.out.println("查詢成功,數字位於陣列第"+(result+1)+"位");
		                count=result+1;
		                System.out.println("查詢次數為"+count);
		            }
		            //結束時間
		            long endTime = System.currentTimeMillis();
		            //呼叫函式,計算程式執行時間
		            System.out.println("程式執行時間:" + (endTime - startTime)+"ms");
		        }
		        //定義sequenSearch方法
		        private static int sequenSearch(int[] arr, int num) {
		            for(int i=0; i<arr.length; i++) {
		                if(arr[i] == num){
		                    return i;//返回資料的位置
		                }
		            }
		            return 0;		            
		        }
		    }
		}

二分檢索演算法

package joe;
import javax.swing.JOptionPane;
import java.util.Scanner;
public class search {
	public static void main(String[] args){	
	    //開始時間
		long startTime = System.currentTimeMillis();
		//定義已知陣列的內容
		int a[]={1,2,3,4,5,6,7,8,9,10,11};
		System.out.print("請輸入要查詢的數字:");		
		Scanner scan=new Scanner(System.in);
		int x=scan.nextInt();
		int s=binarySearch(a,x,11);
		System.out.println(s);
		//結束時間	
		long endTime = System.currentTimeMillis();
	    //呼叫函式,計算程式執行時間
	    System.out.println("程式執行時間:" + (endTime - startTime)+"ms");
	}	
	public static int binarySearch(int [] a, int x, int n)
	   {
	     // 在 a[0] <= a[1] <= ... <= a[n-1] 中搜索 x
	     // 找到x時返回其在陣列中的位置,否則返回-1
	     int left = 0; int right = n - 1;
	     while (left <= right) {
	       int middle = (left + right)/2;
	       if (x == a[middle]) return middle;
	       if (x > a[middle]) left = middle + 1;
	       else right = middle - 1;
	      }
	     return -1; // 未找到x
	   }
}

其次是通過查詢大量的資料來獲得順序檢索和二分檢索演算法在時間上的差距(自動獲取100個10以內的隨機數進行檢索,對比所需要的時間)
順序檢索演算法

package joe;	
		import java.util.Arrays;
		import java.util.Scanner;
		public class paixu {
			public static class Jiansuo{
		        public static void main(String[] arg) {
		            //開始時間
		            long startTime = System.currentTimeMillis();
		            int count = 0;
		            //定義已知陣列的內容
		            int[] arr = {1,2,3,4,5,6,7,8,9,10,11};
		            //進行100次迴圈
		            for(int i=0;i<100;i++){
		                //隨機產生10以內的整數
		            	int num=(int)(1+Math.random()*10);
		            	System.out.println(num);
		                int result = sequenSearch(arr, num);
		                if(result == 0){
		                    System.out.println("查詢失敗");
		                    System.out.println("查詢次數為"+arr.length);
		                }else{
		                    System.out.println("查詢成功,數字位於陣列第"+(result+1)+"位");
		                    count=result+1;
		                    System.out.println("查詢次數為"+count);
		                }
		            }
		            //結束時間
		            long endTime = System.currentTimeMillis();
		            //呼叫函式,計算程式執行時間
		            System.out.println("程式執行時間:" + (endTime - startTime)+"ms");
		        }
		        //定義sequenSearch方法
		        private static int sequenSearch(int[] arr, int num) {
		            for(int i=0; i<arr.length; i++) {
		                if(arr[i] == num){
		                    return i;//返回資料的位置
		                }
		            }
		            return 0;		            
		        }
		    }
		}

二分檢索演算法

package joe;
import javax.swing.JOptionPane;
import java.util.Scanner;
public class search {
	public static void main(String[] args){	
	    //開始時間
		long startTime = System.currentTimeMillis();
		int a[]={1,2,3,4,5,6,7,8,9,10,11};
		//進行100次迴圈
		for(int i=0;i<100;i++){
		    //生成10以內的隨機數
			int x=(int)(1+Math.random()*10);
			System.out.println(x);
		    int s=binarySearch(a,x,11);
		    System.out.println("查詢次數為:"+s);	
		}
		//結束時間
		long endTime = System.currentTimeMillis();
	    //呼叫函式,計算程式執行時間
	    System.out.println("程式執行時間:" + (endTime - startTime)+"ms");
	}	

	public static int binarySearch(int [] a, int x, int n)
	   {
	     // 在 a[0] <= a[1] <= ... <= a[n-1] 中搜索 x
	     // 找到x時返回其在陣列中的位置,否則返回-1
	     int left = 0; int right = n - 1;
	     while (left <= right) {
	       int middle = (left + right)/2;
	       if (x == a[middle]) return middle;
	       if (x > a[middle]) left = middle + 1;
	       else right = middle - 1;
	      }
	     return -1; // 未找到x
	   }
}

通過進行實際執行,我得到了兩者的時間比為11:7,由此可得:二分檢索演算法的時間複雜度要比順序檢索的時間複雜度好。