問題描述:
如題,其中迴圈有序陣列指的是對有序陣列進行迴圈移位後的結果,如[7,8,9,0,1,2,3,4,5,6];
實現思路:
由迴圈有序陣列結構可知,若陣列不為整體有序,則最小值一定是處於無序子串行之中,如上述例子中,最小值一定處於7到1之間,而一定不處於1到6之間,根據該性質可以得到如下演算法:
先進行判斷該陣列是否整體有序(arr[left] < arr[right]),若有序返回left即可。
對於整體無序情況(arr[left] < arr[right]),mid = left + (right - left) / 2,判斷left - mid 和 mid - right是否為有序,
若arr[mid] > arr[right] 對mid - right部分進行查詢,arr[mid] < arr[left] 對left - mid 部分進行查詢.;
若以上條件均不滿足即(arr[mid] <= arr[right] && arr[mid] >= arr[left]),又由於arr[left] >=arr[right] 所以可得:
arr[mid] = arr[left] = arr[right],對於該情況只能採用從頭到尾的方式進行搜尋了。
具體實現**如下:
public static int selution(int arr)
mid = left + (right - left) / 2;
// arr[left] >= arr[right]
if (arr[mid] < arr[left])
if (arr[mid] > arr[right])
if (arr[mid] >= arr[left] && arr[mid] <= arr[right])
}return arr[left] < arr[right] ? left : right;// 返回left right 中最小的
}public static int findmin(int arr, int left, int right)
}return minindex;
}
尋找有序陣列的反轉陣列中最小的元素
尋找有序陣列的反轉陣列中最小的元素 1.利用二分查詢法查詢。設定兩個指標,分別指向陣列的第乙個p1和最後乙個元素p2。2.得到陣列中間位置的元素,將這個元素與第乙個元素比較,如果大於第一元素,證明這個最小的數字在這個中間元素的後面,此時將p1指向中間元素的下乙個位置 如果中間元素小於第乙個元素,那麼...
迴圈有序陣列二分查詢
演算法描述,乙個有序的陣列,從開始到中間擷取一段陣列放到陣列的尾部,這個陣列會變成迴圈有序的陣列,在這個迴圈有序的陣列中進行二分查詢 例如 1,2,3,4,5,6,7,8,9 擷取前4位放到尾部會變成5,6,7,8,9,1,2,3,4 變成迴圈有序的陣列 演算法實現 採用二分查詢的方式,獲取中間的乙...
迴圈有序陣列查詢值
迴圈陣列,即有序的陣列進行移位後的陣列。如 4,5,6,7,8,0,1,2,3 查詢值是否存在時,利用二分的思想。步驟 while lmid key,return mid。如果a mid l 說明l mid是有序的,mid 1 r是迴圈的 如果key mid key a l 則key在l mid 1...