二分搜尋應用(旋轉陣列) C語言

2022-09-02 18:39:11 字數 1932 閱讀 3663

出處——《劍指offer》

題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。

1.用遍歷陣列的方法來實現

int mininorder( int num, index1, index2 )        /*index1為陣列起始位置,index2為陣列終止位置*/

int result = num[ index1 ];

int i;

for( i = index1 + 1; i <= index2; i++ )

if( result > num[i] )

result = num[i];

return result;

演算法複雜度o(n)

2.若能夠使用二分搜尋實現可以使演算法複雜度為o(logn)

書中有詳細的講解,跟一般的二分搜尋類似,但由於不是查詢特定的數,而是要找到最小的數,因此要找到如何能夠確定最小數的方法。根據旋轉陣列的特點,可以將其看作兩個遞增陣列的組合,且左邊陣列的所有元素都大於右邊陣列,最小數所在的位置為右邊陣列的第一位。

設定三個指標i1,i2以及mid,使得i1始終處在左邊陣列中,i2始終處在右邊陣列中, mid為中間數,通過i1,i2,mid元素間的大小關係來逐步確定最小數的位置。

例如:若num[mid] >= num[i1]表明mid在左邊陣列中,那麼令i1 = mid就可以使得i1趨近於左邊陣列末尾;若num[mid] <= num[i2]表明mid在右邊陣列中,此時則可令i2 = mid。

最終當i2 - i1 == 1時,i2就為最小元素的位置。

int min( int num, int length )        /*length為陣列長度*/

int i1, i2, mid;

i1 = 0;

i2 = length - 1;

while( num[i1] >= num[i2] )       /*保證i1,i2處在不同的子陣列中*/

if( i2 - i1 == 1 )

return num[i2];

mid = ( i1 + i2 ) / 2;

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

i1 = mid;

if( num[mid] <= num[i2] )

i2 = mid;

return num[i1];        /*完全遞增的陣列也是旋轉陣列的一種,當出現這種情況時,由於num[i1] < num[i2]使得迴圈不執行,此時返回陣列首元素*/

不過上面的程式面對一些特例時會出現問題,如陣列,會出現num[i1] = num[i2] = num[mid] = 1的情況,此時迴圈中的兩個if語句中的判斷條件都為真,因此當第一次迴圈結束後就會出現i1 = i2 = mid的情況,使得迴圈無限執行。因此需要將這種情況考慮到函式中。

int min( int num, int length )      

int i1, i2, mid;

i1 = 0;

i2 = length - 1;

while( num[i1] >= num[i2] )       

if( i2 - i1 == 1 )

return num[i2];

mid = ( i1 + i2 ) / 2;

if( num[i1] == num[i2] && num[i1] == num[mid] )       /*出現i1, i2, mid三個元素都相等的情況則採用順序搜尋的方法*/

return mininorder( num, i1, i2 );

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

i1 = mid;

if( num[mid] <= num[i2] )

i2 = mid;

return num[i1];        

二分搜尋 旋轉陣列

以二分搜尋為基本思路 簡要來說 nums 0 nums mid 0 mid不包含旋轉 且nums 0 target nums mid 時 high 向前規約 nums mid nums 0 0 mid包含旋轉 target nums mid nums 0 時向前規約 target 在旋轉位置到 mi...

旋轉陣列的二分查詢

1 什麼是旋轉陣列 旋轉陣列是將乙個有序陣列的前若干個數旋轉到陣列末尾,例如陣列a 5 那麼陣列b 5 為陣列a的乙個旋轉陣列 2 旋轉陣列的二分查詢之找到給定key 對於給定乙個數key,如何從旋轉陣列中找到key的位置呢?由於旋轉陣列部分有序,故可以利用二分查詢思想來設計演算法,從而達到logn...

旋轉陣列的二分查詢

1.問題描述 已知有序陣列a n 從中間某個位置k k未知,k 1表示整個陣列有序 分開,然後將前後兩部分互換,得到新的陣列,在該新陣列的查詢元素x。如 a 從k 4分開,得到新陣列a 一次二分查詢 二分查詢演算法有兩個關鍵點 1 陣列有序 2 根據當前區間的中間元素與x的大小關係,確定下次二分查詢...