就是簡單的從左往右或者從右往左遍歷,待查詢的陣列並不需要有序,查到返回true
,否則返回false
。
時間複雜度:
二分查詢可以將查詢的時間複雜度降低到o(logn)
,但是前提是待查詢的陣列必須是有序的陣列,當陣列有序時,可以使用三個指標,乙個左指標和乙個右指標以及乙個中間指標如果待查詢的元素小於中間元素,則將查詢範圍縮小到陣列的前半部分,如果待查詢元素大於中間元素,則將查詢範圍縮小陣列後半部分。
left=0
,right=n-1
,mid=(left+right)/2
。
為了防止mid
越界,使用right-(right-left)/2
或者(right-left)/2+left
進行緩衝。
時間複雜度:o(logn)
。
public
class
binarysearch
else
}return
false;}
public
static
void
main
(string[
] args)
binarysearch binarysearch =
newbinarysearch()
;for
(int i =
1; i <
25; i++)}
}
插值查詢是二分查詢的一種優化,將mid
指標的值進行了優化,當待查詢陣列(有序)的值分布較均勻時,使用插值查詢效率較高,但是如果分布不均勻,效率較低。中間指標的公式如下:
mid=left+(target-a[left])/(a[right]-a[left])*(right-left)
。
其中,target
表示待查詢的值,a
表示待查詢陣列。
public
class
insertsearch
public
boolean
insertsearch
(int
nums,
int target,
int l,
int h)
else
//if (nums[mid]return
insertsearch
(nums,target,mid+
1,h);}
public
static
void
main
(string[
] args)
insertsearch insertsearch =
newinsertsearch()
;for
(int i =
1; i <
25; i++)}
}
斐波那契查詢也是對二分查詢的一種改進,改進思路是基於**分割點(0.618:1或者1.618:1),我們發現斐波那契數列從第3個數開始,前乙個數與後乙個數的商隨著n
的增大,越來越接近於0.618
。
[借助一張網路]
我們需要先維護乙個斐波那契數列的陣列,每次指標移動都根據**分割比例進行分割,不再是簡單的對半分。
時間複雜度分析:
斐波那契數列一般計算到第20
個就差不多,因為第20
個數已經很大了。
public
class
fabonaccisearch
int l=
0,r=f[k]-1
;while
(l<=r)
else
if(nums2[mid]
else
else}}
return
false;}
public
void
fabonacci
(int
f,int size)
}public
static
void
main
(string[
] args)
fabonaccisearch fabonaccisearch =
newfabonaccisearch()
;for
(int i =
1; i <
25; i++)}
}
面試常見演算法 排序查詢演算法
常見面試問題總結目錄 演算法是程式設計師必被的乙個技能,在面試中常常出現,下面總結了面試中出現的常見演算法,這些演算法程式設計師應該牢記在心中,要非常熟練。原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 ...
查詢演算法之折半查詢
binary search 折半查詢又稱二分查詢,要求資料序列呈線性結構,即先排序,在查詢。可以明顯的提高查詢速度,其流程如下 預設陣列為a 需查詢的值為x 首先設定3個變數low mid high,分別儲存陣列元素開始 中間和末尾元素的序號。接著進行以下判斷。1 如果陣列中序號為mid的值與需查詢...
查詢演算法之順序查詢
演算法思想 順序查詢演算法是一種較為簡單的演算法,它把待查詢的所有序列元素都遍歷一遍,直到查詢到該關鍵字為止。時間複雜度最壞的情況下為o n 時間複雜度最好的情況下為o 1 順序查詢演算法實現 author qiu public class ordersearch 待查詢陣列 int key 8 待...