C語言輸出旋轉後數組中的最小數元素的算法原理與實例
問題描述:把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個排好序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3, 4, 5, 1, 2}為{1, 2, 3, 4, 5}的.一個旋轉,該數組的最小值為1。
思路:這道題最直觀的解法並不難。從頭到尾遍歷數組一次,就能找出最小的元素,時間複雜度顯然是O(n)。但這個思路沒有利用輸入數組的特性。既然有時間複雜度更小的算法,我們容易想到二分查找,因為它的時間複雜度為O(logn)。這個問題是否可以運用二分查找呢?答案是肯定的。觀察一下數組的特性,首先遞增(稱為遞增a),然後突然下降到最小值,然後再遞增(稱為遞增b)。當然還有一種特殊情況,就是數組遞增,中間沒有下降,即旋轉元素個數為0。
對於一般的情況,假設A為輸入數組,left 和 right 為數組左右邊界的座標,考察中間位置的值A[mid] ,如果A[mid] <= right="mid;如果A[mid]">= A[left],表明處於遞增a,因此調整左邊界left = mid。當左右邊界相鄰時,較小的一個就是數組的最小值。其實,對於一般情況,右邊界所指的元素為最小值。
對於特殊情況,即旋轉個數為0。按照上述算法,右邊界會不斷減少,直到與左邊界相鄰。這時左邊界所指的元素為最小值。下面給出幾組測試案例:
//{1,2,3,4,5,6,7,8,9,10} 1 //{4,5,6,7,8,9,10,1,2,3} 1 //{1,1,1,1,1,1,1,1,1,1} 1 //{1,9,10,1,1,1,1,1,1,1} 1 //{9,9,9,9,9,9,9,10,1,9} 9 錯誤
第五組的結果是錯誤的。其實,上述算法適用於嚴格遞增的數組,對於非嚴格遞增,用二分法無法保證正確解。有興趣的讀者,可以試試,對於非嚴格遞增的序列,是否可以用二分法得到正確解。
參考代碼:
//函數功能 : 旋轉數組的最小元素 //函數參數 : pArray指向數組,len為數組長度 //返回值 : 最小元素 int FindMin(int *pArray, int len) { if(pArray == NULL || len <= return="" int="" left="" right="" -="" mid="left">>1); if(pArray[right] >= pArray[mid]) right = mid; else if(pArray[left] <= left="mid;" return=""> pArray[left] ? pArray[left]: pArray[right]; }
-
C語言中文件操作詳解及實例代碼
在文件操作中除了打開操作以及讀寫操作,還有幾種比較常見的操作。以下是本站小編搜索整理的關於這些操作中涉及到的函數,,需要的朋友可以參考本文!想了解更多相關信息請持續關注我們應屆畢業生考試網!一.移動位置指針的函數rewind函數和fseek函數,這兩個函數的原...
-
C語言轉義字符和格式控制符參考
導語:字符型常量所表示的值是字符型變量所能包含的值。我們可以用ASCII表達式來表示一個字符型常量,或者用單引號內加反斜槓表示轉義字符。下面是C語言轉義字符和格式控制符參考,歡迎學習:轉義字符參考:a:蜂鳴,響鈴:回退:向後退一格f:換頁:換行,光標到下行行首:回車,光...
-
C語言中的整數(short,int,long)
整數是編程中常用的一種數據,C語言使用int來定義整數(int是integer的簡寫)。歡迎大家閲讀!更多相關信息請關注相關欄目!現代操作系統中int一般佔用4個字節內存,共計32位(Bit)。如果不考慮正負數,當所有的位都為1時它的值最大,為232-1=4,294,967,295≈43億,這是一個很大的...
-
二級C語言考試複習五要點
綜觀近幾年全國計算機等級二級基礎部分和C語言程序設計的題目,筆試中大多數考題是與大綱要求的基本內容一致的,難度不高,但內容十分廣泛,應牢固掌握。以下是小編為您帶來的二級C語言考試複習五要點,感謝您的閲讀!一、瞭解試卷,胸中有數綜觀近幾年全國計算機等級二級...