1. 程式人生 > >java順序查詢和二分法查詢

java順序查詢和二分法查詢

1, 順序查詢

2, 二分法查詢

 

一、順序查詢的基本思想:

從表的一端開始,順序掃描表,依次將掃描到的結點關鍵字和給定值(假定為a)相比較,若當前結點關鍵字與a相等,則查詢成功;若掃描結束後,仍未找到關鍵字等於a的結點,則查詢失敗。

 

說白了就是,從頭到尾,一個一個地比,找著相同的就成功,找不到就失敗。很明顯的缺點就是查詢效率低。

 

適用於線性表的順序儲存結構和鏈式儲存結構。

計算平均查詢長度。

例如上表,查詢1,需要1次,查詢2需要2次,依次往下推,可知查詢16需要16次,

可以看出,我們只要將這些查詢次數求和(我們初中學的,上底加下底乘以高除以

2),然後除以結點數,即為平均查詢長度。

n=節點數

平均查詢長度=n+1)/2

計算平均查詢長度。

例如上表,查詢1,需要1次,查詢2需要2次,依次往下推,可知查詢16需要16次,

可以看出,我們只要將這些查詢次數求和(我們初中學的,上底加下底乘以高除以2),然後除以結點數,即為平均查詢長度。

n=節點數

平均查詢長度=n+1)/2

 

Java實現:

 

  1.   import java.util.Scanner;
  2.    
  3.   public class SequentialSearch {
  4.   int a[]={ 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34
    , 15, 35, 25, 53, 51};
  5.   public SequentialSearch(){
  6.   System.out.println( "請輸入要查詢的數字:");
  7.   Scanner input= new Scanner(System.in);
  8.   int input1=input.nextInt();
  9.   for( int i= 0;i<a.length;i++){
  10.   if(a[i]==input1){
  11.   System.out.println(input1+ "的位置為:"+i);
  12.   break;
  13.   }
  14.   if(i==a.length- 1)
  15.   System.out.println( "No Result!");
  16.   }
  17.   }
  18.   }

 

 

二、二分法查詢(折半查詢)的基本思想:

 

前提:

(1)確定該區間的中點位置:mid=(low+high)/2    

min代表區間中間的結點的位置,low代表區間最左結點位置,high代表區間最右結點位置

(2)將待查a值與結點mid的關鍵字(下面用R[mid].key)比較,若相等,則查詢成功,否則確定新的查詢區間:

如果R[mid].key>a,則由表的有序性可知,R[mid].key右側的值都大於a,所以等於a的關鍵字如果存在,必然在R[mid].key左邊的表中。這時high=mid-1

如果R[mid].key<a,則等於a的關鍵字如果存在,必然在R[mid].key右邊的表中。這時low=mid+1

如果R[mid].key=a,則查詢成功。

(3)下一次查詢針對新的查詢區間,重複步驟(1)和(2)

(4)在查詢過程中,low逐步增加,high逐步減少,如果low>high,則查詢失敗。

 

 

平均查詢長度=Log2(n+1)-1

 

注:雖然二分法查詢的效率高,但是要將表按關鍵字排序。而排序本身是一種很費時的運算,所以二分法比較適用於順序儲存結構。為保持表的有序性,在順序結構中插入和刪除都必須移動大量的結點。因此,二分查詢特別適用於那種一經建立就很少改動而又經常需要查詢的線性表。

所以說用折半查詢時序列必須是有序的!

 

java實現:

 

 

  1.   import java.util.ArrayList;
  2.   import java.util.List;
  3.    
  4.   public class binarySearch {
  5.   public binarySearch(){
  6.   List<Integer> list= new ArrayList<Integer>();
  7.   for( int i= 0;i< 10000;i+= 2){ //往list加入逐漸增大1-10000的所有偶數,作為實驗陣列,很明顯,他是有序的!
  8.   list.add(i); //這裡當然也可用陣列
  9.   }
  10.   int low= 0;
  11.   int high=list.size();
  12.   int key= 3334;
  13.   while(low<=high){
  14.   int mid=(low+high)/ 2;
  15.   if(key==list.get(mid)){
  16.   System.out.println( "此數值在list中的位置為:"+mid);
  17.   break;
  18.   }
  19.   if(key>list.get(mid)){
  20.   low=mid+ 1; //當小於時,是low指標向後移動,high指標不變
  21.   }
  22.   if(key<list.get(mid)){
  23.   high=mid- 1; //當大於時,是high指標向前移動,low指標不變
  24.   }
  25.    
  26.   }
  27.   if(low>high){
  28.   System.out.println( "沒有查到結果!");
  29.   }
  30.   }
  31.   }
  32.    
  33.  

1, 順序查詢

2, 折半查詢

 

一、順序查詢的基本思想:

從表的一端開始,順序掃描表,依次將掃描到的結點關鍵字和給定值(假定為a)相比較,若當前結點關鍵字與a相等,則查詢成功;若掃描結束後,仍未找到關鍵字等於a的結點,則查詢失敗。

 

說白了就是,從頭到尾,一個一個地比,找著相同的就成功,找不到就失敗。很明顯的缺點就是查詢效率低。

 

適用於線性表的順序儲存結構和鏈式儲存結構。

計算平均查詢長度。

例如上表,查詢1,需要1次,查詢2需要2次,依次往下推,可知查詢16需要16次,

可以看出,我們只要將這些查詢次數求和(我們初中學的,上底加下底乘以高除以2),然後除以結點數,即為平均查詢長度。

n=節點數

平均查詢長度=n+1)/2

計算平均查詢長度。

例如上表,查詢1,需要1次,查詢2需要2次,依次往下推,可知查詢16需要16次,

可以看出,我們只要將這些查詢次數求和(我們初中學的,上底加下底乘以高除以2),然後除以結點數,即為平均查詢長度。

n=節點數

平均查詢長度=n+1)/2

 

Java實現:

 

  1.   import java.util.Scanner;
  2.    
  3.   public class SequentialSearch {
  4.   int a[]={ 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51};
  5.   public SequentialSearch(){
  6.   System.out.println( "請輸入要查詢的數字:");
  7.   Scanner input= new Scanner(System.in);
  8.  

    相關推薦

    java順序查詢二分查詢

    1, 順序查詢 2, 二分法查詢   一、順序查詢的基本思想: 從表的一端開始,順序掃描表,依次將掃描到的結點關鍵字和給定值(假定為a)相比較,若當前結點關鍵字與a相等,則查詢成功;若掃描結束後,仍未找到關鍵字等於a的結點,則查詢失敗。   說白了就是,從頭

    Java常見演算法之二分查詢演算法詳解

    一、簡介 二分法查詢,是在已經排好序的序列中,定義一個起始位置start(即序列第一個元素)和一個終止位置end(即序列最後一個元素),通過mid=(start+end)/2計算出中間位置,通過待查詢元素與mid中間位置的元素進行比較,如果待查詢元素比中間位置mid對應的值

    查詢演算法(順序查詢二分查詢、二叉樹查詢、hash查詢

    查詢功能是資料處理的一個基本功能。資料查詢並不複雜,但是如何實現資料又快又好地查詢呢?前人在實踐中積累的一些方法,值得我們好好學些一下。我們假定查詢的資料唯一存在,陣列中沒有重複的資料存在。 (1)順序查詢(普通的資料查詢)                   設

    靜態表查詢二分靜態表查詢

    簡單的操作。。不解釋 #include <iostream> #include <cstdio> #include <cstdlib> #include <string> #include <cmath> #in

    C程式設計--查詢二分查詢/折半查詢

    二分法查詢/折半查詢 說明:折半搜尋(half-interval search),也稱二分搜尋(binary search)、對數搜尋(logarithmic search),是一種在有序陣列中查詢某一特定元素的搜尋演算法。 搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢

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

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

    Java中常用的查詢演算法——順序查詢二分查詢

    import java.util.Scanner; /* * 順序查詢 */ public class SequelSearch { public static void main(String[] arg) { int[] a={4,6,2,8,1,9,0,3}; Scann

    Java — 線性查詢二分查詢

    1,線性查詢法: 工作原理:它又稱之為順序查詢。在一列給定的值中進行搜尋,從一端開始逐一檢查每個元素,直到找到所需元素的過程 ●查詢指定的數在陣列中出現的位置,找到返回下標,找不到返回-1 程式碼如下: import java.util.Scanner; publi

    Java中陣列的補充方法(增強版遍歷、逆序、氣泡排序、二分查詢

    陣列的補充方法 在《陣列》文章中簡單的介紹了陣列的基本格式和實現案例,此處不做說明,此文主要是補充一些陣列的使用方法。例如:增強版的遍歷、逆序、氣泡排序、二分法查詢。 增強版遍歷: 1.與普通遍歷的區別: 普通的遍歷給人的直觀感覺不是很好,輸出的元素都是排列不好看,所以需

    二分查詢---java

    比較簡單,直接上程式碼了   package cn.nrsc.algorithm; /** * * @author 孫川 二分查詢就是在一堆已經排好序的陣列中通過折半規則查找出某個數在陣列中的位置 * */ public class BinarySearch { pu

    java版資料結構與演算法—遞迴(二分查詢)

    package com.zoujc.triangle; /** * 遞迴:二分查詢 */ class OrdArray { private int[] a; private int nElems; public OrdArray(int max){

    順序查詢二分查詢

    順序查詢(演算法思想): 從待查詢資料的第一個元素開始,逐個將每個元素與要查詢的資料值進行對比:如果比較到兩者值相同,則查詢成功,如果一直未找到,則查詢失敗 def Linear(values, key): leng = len(values) for i in rang

    Java之陣列排序及二分查詢

    首先先介紹兩種最基本的陣列排序方法:冒泡法和選擇法。 冒泡法排序:依次比較相鄰的兩個元素,如果第一個比第二個大,則交換他們兩個,如此一輪比較下來會產生一個最大的數位於陣列末尾,第二次比較則進行到陣列長度-1個元素,以此類推。 /** *

    JAVA二分查詢指定元素的下標

    如果,我們要在一個數組中查詢某個指定的元素,可以使用二分法,從而大大降低查詢效率,前提是所給定的陣列是已經排序的; 下面是一個小小的例子 public class BinarySearch{ publ

    演算法-基礎查詢-1.漢諾塔/2.順序查詢/3.二分查詢/4.順序查詢二分查詢的比較

    1.漢諾塔:   如下圖所示,需要將A柱子中的所有圓盤按照從小到大的順序移動到C柱子上,並且在移動過程中大圓盤不能在小圓盤上面      分析問題:最終希望呈現的結果是將A柱子上的盤子全部按照從小到大的順序移動到C柱子上     1.n個盤子,將n-1視為一個整體     2.將n-1個盤子視為一個

    折半查詢遞迴折半查詢詳解(二分查詢,遞迴二分查詢

    演算法:當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。(前提) 主要思想是:(設查詢的陣列區間為array[low, high]) (1)確定該區間的中間位置K (2)將查詢的值T與

    JAVA中 * 二分查詢陣列中的數值下標

    /* * 二分法查詢陣列中的數值下標 */import java.util.Scanner;public class TwopointSearch {public static void main(String [] args){int []arr={1,3,4,5,2,6,

    插入排序,歸併排序,快速排序的實現速度比較(包含二分查詢所有匹配元素)

    最近在學習排序演算法,實現後比較了花費時間情況,現在總結一下插入排序的時間複雜度是O(n²),是一種很直觀的排序方式。歸併排序為O(nlogn),實現起來也比較簡單。快速排序平均時間複雜度也是O(nlogn),實現起來比歸併複雜一些。經過比較發現快速排序比歸併排序要快一些,大

    JAVA實現二分查詢並輸出每一趟查詢的結果

     public class Binary { public static void main(String[] args) { int[] a={1,3,4,5,6,7,8,9,10,22,44,55,66,77,88,99}; int result=find(

    Java二分查詢與氣泡排序

    1、二分法:  在給出的有序排列的陣列中,把目標值和陣列中間值進行比較,如果相等,則返回中間值下標,如果目標值小於中間值,就從數  組的前半段再次執行二分法查詢,如果目標值大於中間值,從陣列的後半段開始二分法查詢。 二分法查詢主要是比較的次數少,查詢的速度快,平均效能好。