資料結構 二分查詢

2021-07-04 10:41:35 字數 2893 閱讀 8423

二分查詢演算法也稱為折半搜尋、二分搜尋,是一種在有序陣列中查詢某一特定元素的搜尋演算法。
①搜素過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束;

②如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。

③如果在某一步驟陣列為空,則代表找不到。

這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

①找出位於陣列中間的值,並存放在乙個變數中(為了下面的說明,變數暫時命名為temp);

②需要找到的key和temp進行比較;

③如果key值大於temp,則把陣列中間位置作為下一次計算的起點;重複① ②。

④如果key值小於temp,則把陣列中間位置作為下一次計算的終點;重複① ② ③。

⑤如果key值等於temp,則返回陣列下標,完成查詢。

**如下:

public static int binarysearch(int nums, int target) 

int start=0;

int end=nums.length-1;

while(start<=end)

else if(nums[mid]>target)

else

}return 0;

}

**如下:

public static int binarysearch(int array,int low,int high,int key)

return 0;

}

二分查詢過程可用二叉樹來描述:把當前查詢區間的中間位置上的結點作為根,左子表和右子表中的結點分別作為根的左子樹和右子樹。由此得到的二叉樹,稱為描述二分查詢的判定樹(decision tree)或比較樹(comparison tree)。(注意:

判定樹的形態只與表結點個數n相關,而與輸入例項中r[1..n].keys的取值無關。

)下面介紹乙個例子,畫出陣列r[1...11]的判定樹。如下圖所示:

如圖所示:不難發現,找到有序表中任一記錄的過程就是走了一條從根節點到該記錄相應的節點的路徑,和給定值進行不叫的關鍵字個數恰為該節點在判定樹上的層次數。因此,折半查詢演算法在查詢成功時進行比較的關鍵字個數最多不超過樹的深度,而具有n個節點的判定樹的深度為「log2

n」+1,log2

n向下取整加1,所以二分查詢法在查詢成功是和給定值進行比較的關鍵字個數至多為「log2

n」+1;二分查詢在查詢失敗時所需比較的關鍵字個數不超過判定樹的深度,在最壞情況下查詢成功的比較次數也不超過判定樹的深度。即為:

假設有乙個排序的按未知的旋轉軸旋轉的陣列(比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2)。給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回-1。

你可以假設陣列中不存在重複的元素。

樣例給出[4, 5, 1, 2, 3]和target=1,返回 2

給出[4, 5, 1, 2, 3]和target=0,返回 -1

public class solution 

int start=0,end=a.length-1;

int mid=0;

while(start<=end)

// 左半區間是遞增的

if(a[mid]>=a[start])

else

}else

int mid=0;

int start=0,end=num.length-1;

while(start<=end)

if(num[mid]>num[start])

int res=0;

int length=a.length;

int start=0;

int end=length-1;

//int mid=start;

while(a[start]>=a[end])

int mid=(start+end)/2;

if(a[mid]>=a[start])

else if(a[mid]<=a[end])

}return a[res];}}

假設乙個旋轉排序的陣列其起始位置是未知的(比如0 1 2 4 5 6 7

可能變成是4 5 6 7 0 1 2)。

你需要找到其中最小的元素。

陣列中可能存在重複的元素。樣例

給出[4,4,5,6,7,0,1,2]

返回 0

public class solution 

int length=num.length;

int res=0;

int start=0;

int end=length-1;

while(num[start]>=num[end])

int mid=(start+end)/2;

if(num[mid]==num[start]&&num[mid]==num[end])

if(num[mid]>=num[start])

else if(num[mid]<=num[end])

}return num[res];

}private static int findmin(int num,int start,int end)

int start=0,end=a.length-1;

int mid=0;

while(start<=end)

mid=(start+end)/2;

if(mida[mid+1])

}return 0;}}

資料結構 二分查詢

總共有n個元素,漸漸跟下去就是n,n 2,n 4,n 2 k 接下來操作元素的剩餘個數 其中k就是迴圈的次數。由於你n 2 k取整後 1,即令n 2 k 1,可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn public class binarysearch else...

資料結構 二分查詢

二分查詢適用於有序的順序表,基本的思路是 首先將給定的關鍵字key與表array的中間位置的元素進行比較。如果相等,則查詢成功,如果不相等,則查詢的元素一定在表的前半部分或者後半部分。繼續縮小範圍到前半部分或者後半部分再進行同樣的查詢,直到找到為止,或者查完之後仍然沒有找到元素。下面給出一次演算法的...

資料結構 二分查詢

二分查詢適用於有序的順序表,基本的思路是 首先將給定的關鍵字key與表array的中間位置的元素進行比較。如果相等,則查詢成功,如果不相等,則查詢的元素一定在表的前半部分或者後半部分。繼續縮小範圍到前半部分或者後半部分再進行同樣的查詢,直到找到為止,或者查完之後仍然沒有找到元素。下面給出一次演算法的...