本文實現了以下功能,並作了簡單的分析,邏輯清晰,簡單,各個**維護了乙個相似的結構。
1)二分查詢元素key的下標,如無 return -1
2)二分查詢返回key(可能有重複)第一次出現的下標,如無return -1
3)二分查詢返回key(可能有重複)最後一次出現的下標,如無return -1
4)二分查詢返回剛好小於key的元素下標,如無return -1
5)二分查詢返回剛好大於key的元素下標,如無return -1
測試**來自 二分查詢,你真的會嗎?
#include#include/* bisearch 尋找key下標,不存在 return -1 */
int bisearch(int *arr, int b, int e, int v)
if (!(min > e) && (arr[min]==v)) // when arr[b]>v, max = b-1;
return min;
else
return -1;
}/* bisearch_max 返回key(可能有重複)最後一次出現的下標,如無return -1*/
/* 分析
實際上迴圈過程維持[0,min-1]<=v;[max+1, n-1]>v.
在退出迴圈時,必然為min=max+1;如下圖
a[1],a[2],a[3],....a[i-1],a[i],a[i+1],...,a[n]
^ ^
| |
max min
所以迴圈退出後arr[max]為陣列中<=v的最大元素,判斷其是否等於v即可。
但需要注意,當v小於陣列中的最小值時,當退出迴圈時,maxv, max = b-1;
return max;
else
return -1;
}/* bisearch_justsmall 返回剛好小於key的元素下標,如無return -1*/
/* 分析
實際上迴圈過程維持[0,min-1]=v.
在退出迴圈時,必然為min=max+1;如下圖
a[1],a[2],a[3],....a[i-1],a[i],a[i+1],...,a[n]
^ ^
| |
max min
所以迴圈退出後arr[max]為陣列中剛好小於v的第乙個元素。
但需要注意,當v小於陣列中的最小值時,當退出迴圈時,maxv.
在退出迴圈時,必然為min=max+1;如下圖
a[1],a[2],a[3],....a[i-1],a[i],a[i+1],...,a[n]
^ ^
| |
max min
所以迴圈退出後arr[min]為陣列中剛好大於v的第乙個元素。
但需要注意,當v大於陣列中的最大值時,當退出迴圈時,min>e,需判斷這一情況。
*/int bisearch_justgreat(int *arr, int b, int e, int v)
if (!(min > e))
return min;
else
return -1;
}
測試**如下:
#define n 20 // 測試陣列大小
void swap(int *a, int *b)
void my_qsort(int *arr, int left, int right)
swap(&arr[temp], &arr[left]);
my_qsort(arr, left, temp-1);
my_qsort(arr, temp+1, right);
}void outputarr(int * arr, int len)
void main()
key = rand() % (n);
outputarr(arr,n);
my_qsort(arr, 0, n-1); // 排序
outputarr(arr,n);
for(i = 0; i < n; ++i)
printf("%2d ", i);
printf("\n");
printf("binsearch: key-%d %d\n", key, bisearch(arr,0,n-1,key));
printf("binsearch_min: key-%d %d\n", key, bisearch_min(arr,0,n-1,key));
printf("binsearch_max: key-%d %d\n", key, bisearch_max(arr,0,n-1,key));
printf("binsearch_justsmall: key-%d %d\n", key, bisearch_justsmall(arr,0,n-1,key));
printf("binsearch_justgreat: key-%d %d\n", key, bisearch_justgreat(arr,0,n-1,key));
}free(arr);
}
E簡單二分查詢
簡單二分查詢 面對二分查詢,主要是你的思路 第一步 你得把陣列有序的排列,一般選擇從小到大。第二步 把l,r,m確定下來。然後看看你得key 如果,key m,你運氣太好一下子就找到了 如果,key如果,key m,此時你考慮在你的右邊找。從小到大排列為例 第三步 迴圈著,就看你的結束條件了,當然了...
陣列 二分查詢 簡單
描述 給定乙個排序的整數陣列 公升序 和乙個要查詢的整數target,用o logn 的時間查詢到target第一次出現的下標 從0開始 如果target不存在於陣列中,返回 1。在陣列 1,2,3,3,4,5,10 中二分查詢3,返回2。挑戰 如果陣列中的整數個數超過了2 32,你的演算法是否會出...
二分查詢簡單題
leetcode 35.search insert position 最普通的binary search,若target存在,則返回所在下標 若target不存在,則返回target待插入的位置,本質上就是實現lower bound函式 無論mid left right left 2,還是mid l...