在移位数组中查找数
題目描述:
一個數組是由一個遞減數列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移兩位形成的,在這種數組中查找某一個數。
?
解析:
很多解法的時間復雜度都停留在O(n),下面的解法 仍為二分查找法 只不過 對應題目做了相應的改進 時間復雜度為O(log2n)
?
1.思路:(畫圖實際上更直觀看出來思路,讀者試著自己畫出圖來對應分析)
設數組a[start]~a[end],mid = (start + end) / 2 在進行二叉查找時,待查找數肯定會在變量mid的兩側,其中mid的取值主要有以下幾情況,
第一種為a[mid] < a[start] 說明此時mid對應的數字在最大數的左邊, 第二種為a[start]? > a[end] 說明此時mid對應的數字在最大數的右邊,這兩種情況對應不同的判斷計算方法,詳見下面的代碼,其他情況不是違反題意就是容易得出結果。
?
2.代碼
#include <iostream>using namespace std;int find(int *a ,int x, int max) {int start = 0, end = max - 1;while(start < end - 1){int mid = start + (end - start)/2;if(a[start] == x)return start;if(a[end] == x)return end;if(a[mid] == x)return mid;if(a[mid] < a[start] ){if( x < a[start] && x > a[mid])end = mid ;elsestart = mid ;}else if(a[mid] > a[end]){if( x > a[end] && x < a[mid])start = mid ;elseend = mid ;}else{if (x != a[mid])return -1;elsereturn mid;}}return -1; }int main() {int a[10] = {4, 3, 2, 1, 10 ,9, 8,7, 6, 5};int index = find(a, 8, 10);cout << "index:" << index << endl;return 0; }?
?
3.執行效果:
?
?
?
?
?
轉載于:https://www.cnblogs.com/biyeymyhjob/archive/2012/09/19/2693879.html
總結
- 上一篇: 梦到别人送钻戒是什么意思
- 下一篇: IE6双倍边距