a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

C語言輸出旋轉后數組中的最小數元素的算法原理與實例

2020-01-26 14:40:36
字體:
來源:轉載
供稿:網友

  問題描述:把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個排好序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{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] <= A[right],表明處于遞增b,調整右邊界 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 <= 0)     return 0;   int left = 0, right = len - 1, mid;   while(right - left != 1)   {      mid = left + ((right - left)>>1);      if(pArray[right] >= pArray[mid])         right = mid;      else if(pArray[left] <= pArray[mid])            left = mid;   }   return pArray[right] > pArray[left] ? pArray[left]: pArray[right]; } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 欧美一区二区三区在线视频观看 | 久久黄视频 | 国产无遮挡呻吟娇喘视频 | 99国内精品久久久久久久 | 精品久久久久久一区二区 | 日韩在线不卡 | 国产主播一区 | 最新日韩欧美 | 91精品国产乱码久久久久久 | 亚洲伊人久久综合 | 在线日韩欧美 | 97久久久国产精品 | 国产精久久久久 | 亚洲欧美高清 | 日韩视频在线观看一区 | 国产精品久久久久久久久久 | 欧美日韩在线一区二区 | 中文二区 | 九九热视频在线 | 综合精品久久久 | 99在线视频观看 | 国产精品国产三级国产有无不卡 | 亚洲综合色视频在线观看 | 色网站免费看 | 91精品麻豆| 欧美成年黄网站色视频 | 亚洲综合无码一区二区 | 色视频免费在线观看 | 久久久精品久久久久 | 国产suv精品一区二区33 | 日本免费网站 | www国产亚洲 | 精品九九久久 | 亚洲黑人在线观看 | 国产一区二区美女 | www在线播放 | 国产欧美精品一区二区三区四区 | 九九九九九九精品任你躁 | 日本xxxx网站| 一区二区三区亚洲 | 久久久国产一区二区 |