排序演算法學習整理拓展(二分查詢)

2022-06-13 04:03:11 字數 1858 閱讀 6722

說到查詢演算法,最簡單最暴力的演算法就是乙個個比較,確定是否為所需要的值。

例如,0,1,2,3,4,5,6,7,8,9 十個數中查詢是否存在數 x ,

那麼暴力的方式就是

1. 取出第乙個數 0 與 x 比較,若相等則返回索引

2. 取出第二個數 1 與 x 比較,若相等則返回索引

3. 取出第三個數 2 與 x 比較,若相等則返回索引

4. 取出第四個數 3 與 x 比較,若相等則返回索引

5. 取出第五個數 4 與 x 比較,若相等則返回索引

10.取出第十個數 9 與 x 比較,若相等則返回索引

這樣如果我需要查詢的 x 為 9 則需要查詢10次,時間複雜度為(o)n 。事實上呢,我們人正常找 x 位於數列的什麼位置會找乙個參照數,

看x大於它還是小於它,然後再在參照數到 x 之間再找乙個參照數,再進行比較,直到找到 x 。

這種思想是在計算機中叫分治,而且當分治的分割方法為對半時,稱這種方法為二分查詢。

二分查詢的優勢在小數列中不太明顯,當存在乙個長度為100 的有序數列,你想找到 x為 50 時,正常的查詢方法就得查詢51次(從0開始),而二分查詢只需要一次。

下面我們來思考一下如何構建二分查詢的演算法:

設:存在乙個 數列 ,設需查詢的數x為7,則有:

1. 找到 5 ;1,2,3,4,5,6,7,8,9,10 。5 != 7 所以,繼續查詢;

由於數列較小,++的速度會比二分的方法快所以先介紹乙個偽二分,

2. 找到 6 ;1,2,3,4,5,6,7,8,9,10。6 != 7,繼續查詢

3. 找到 7 ;1,2,3,4,5,6,7,8,9,10。7 == 7,返回索引

這種二分只適用於較短的陣列,長陣列偽二分的意義不大。但是我們可以像快速排序一樣設定乙個閾值到一定值的時候進行正常比較。

畢竟沒最好的演算法只有最合適的演算法。

接著我們來構建真正的二分演算法。

1. 0+9 = 9,  9/2 = 4 數列的第四個數為5, 所以第一次找到5

2. 7 > 5, 所以取陣列後半節,(5+1+8)/ 2 = 7,陣列的第7個數時8, 所以第二次找到8

3. 8 > 7, 所以取前半截, (7-1+5+1) = 6,陣列的第6個為7, 7 == 7 返回索引。

現在觀察一下思路,發現幾個規律

1.每一次都會有對半操作, (前索引+後索引)/ 2,

2.當中間值與索引上的值不等時會有兩種情況,

1)x比索引上的值大,中間值的索引加1;

2)索引上的值比x小,中間值的索引減1;

從 1 中我們可以寫出一行** (left+right)/  2 

從 2 中我們知道會有兩個判斷語句

1. if (arr[inedx] > x)

2.if (arr[index] < x)

至此核心**就出來了。

下面是完整的二分查詢**:

int binary_search(int nums, int

numssize)

int left = 0, right = numssize-1

;

int index = (left + left) / 2

;

while (left

else

if (nums[index]

return

index;

}

化簡後的二分查詢

int binary_search(int *arr, int n, int

pivot)

if (pivot >arr[mid])

return

mid;

}return -1

;}

簡潔二分

排序演算法學習整理拓展(二分查詢)

說到查詢演算法,最簡單最暴力的演算法就是乙個個比較,確定是否為所需要的值。例如,0,1,2,3,4,5,6,7,8,9 十個數中查詢是否存在數 x 那麼暴力的方式就是 1.取出第乙個數 0 與 x 比較,若相等則返回索引 2.取出第二個數 1 與 x 比較,若相等則返回索引 3.取出第三個數 2 與...

演算法學習 二分法拓展

例1 如何計算2 sqrt 2 的近似值?對 f x x2 f x x f x x 2來說,在x 1,2 x in 1,2 x 1,2 的範圍內,f x f x f x 是隨著x xx 的增大而增大的,這就給二分法創造了條件,由於 2 sqrt 2 是無理數,因此只能獲得它的近似值,這裡不妨以精度到...

演算法學習之路 二分查詢

描述 給定乙個單調遞增的整數序列,問某個整數是否在序列中。輸入 第一行為乙個整數n,表示序列中整數的個數 第二行為n n不超過10000 個整數 第三行為乙個整數m m不超過50000 表示查詢的個數 接下來m行每行乙個整數k。輸出 每個查詢的輸出佔一行,如果k在序列中,輸出yes,否則輸出no。輸...