二分查詢 遞迴和非遞迴 ,插值查詢資料

2021-10-01 08:59:31 字數 1902 閱讀 4973

有三種常用的方法找到需要找到值的下標—順序查詢,二分查詢,插值查詢

順序查詢:很明顯,就是從開始到後面開始遍歷,找到就退出,並返回下標。

沒找到就返回-1.

下面是**:

public static int seqsearch(int arr,int value) 

} return -1;

}

二分查詢:有個缺點,就是必須要先得到排好序的數列。下面步驟是由小到大排序的,要是從大到小就處理相反即可。

步驟:先找到中間下標mid,每次用mid對應的數值跟要查詢的值比較,如果等於就直接返回對應下標,如果小於查詢值就向左邊處理,大於就向右邊處理。

**如下:遞迴方法。

public static int binarysearch(int arr,int left,int right,int findvalue) 

int mid=(left+right)/2;

int midval=arr[mid];

if(findvalue>midval) else if(findvalue非遞迴方法:與遞迴的區別就是用while迴圈,直到找到return。

public static int binarysearch(int arr,int left,int right,int findvalue)

int mid = (left+right)/2;

while(left <= right)

if(arr[mid] > findvalue)

if(arr[mid] < findvalue)

} }

但是有可能這個有序數列中不止這乙個資料和查詢的資料相同,哪就是在處理等於情況下再做處理。(查詢多個相同的,將下標放在乙個list裡面了。)

**如下:

public static arraylistbinarysearch(int arr,int left,int right,int findvalue) 

int mid=(left+right)/2;

int midval=arr[mid];

if(findvalue>midval) else if(findvaluelist=new arraylist();

int temp=mid-1;

//處理左邊的

while(true)

//找到放入。

list.add(temp);

temp-=1;

}//處理中間的

list.add(mid);

//處理右邊的。

temp=mid+1;

while(true)

//找到放入。

list.add(temp);

temp+=1;

}return (arraylist) list;

} }

插值查詢:如果要查詢這個順序的數列的最左邊或最右邊,哪還要查詢log2(n)次,比較麻煩,所以要使用插值查詢。

插值查詢根二分查詢也差不多,只不過那個找中間mid的公式不同,如下:

mid=left+(right-left)*(findvalue-arr[left]/(arr[right]-arr[left]));

**如下:

public static int insertvaluesearch(int arr,int left,int right,int findvalue) 

int mid=left+(right-left)*(findvalue-arr[left]/(arr[right]-arr[left]));

int midval=arr[mid];

if(findvalue>midval) else if(findvalue}

二分查詢 遞迴和非遞迴

二分查詢要求 資料儲存在順序儲存結構中 數字有序排放 原理 將陣列分為三部分,依次是左值,中值,右值 將要查詢的值和陣列的中值進行比較,若小於中值則在中值前 面找,若大於中值則在中值後面找,等於中值時直接返回。然後依次是乙個遞迴過程,將前半部分或者後半部分繼續分解為三部分。迴圈實現二分查詢 temp...

二分查詢(遞迴 非遞迴)

二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。使用條件 查詢序...

遞迴和非遞迴的二分查詢

思路很簡單,注釋已標註 include 遞迴二分查詢 int binarysearch int start,int end,intfinddata int mid start end start 2 根據中間值不斷二分縮小待查元素所在範圍 if finddata mid else if findda...