問題描述:
數組arr[0...mid-1]和arr[mid..n-1]是各自有序的,對數組arr[0..n-1]的兩個有序段進行合並,得到arr[0..n-1]整體。要求空間復雜度為O(1)
eg:{1,3,5,7,2,4,6}合並成{1,2,3,4,5,6,7}
思路:
方法一
很顯然,看到這個題目就想到了歸並中的合並算法,時間復雜度為O(n),但是很可惜空間復雜度也是O(n)不滿足要求。但是還是作為一種解決方案提出來吧,具體實現代碼就不列了。
方法二
此外,對於部分有序的我們能想到的是插入排序,但是本題是兩段部分有序合並在一起,進行插入排序的話時間復雜度也是O(n2),空間復雜度滿足條件。
方法三
本方法的思路有點類似簡單排序的,具體思路如下:
- 遍歷數組中下標為0~mid-1的元素,將遍歷到的元素的值與arr[mid]比較,若arr[i]大於arr[mid],則交換,即第i次排序,將其最右邊的最小的值放到arr[i]的位子上,
- 然后在后半段中將arr[mid]排序到正常的位置上去。
-
1 public static void merge(int [] arr,int mid){ 2 int len = arr.length ; 3 int temp ; 4 for(int i = 0 ; i < mid ; i++){ 5 if(arr[i] > arr[mid]){ 6 temp = arr[i] ; 7 arr[i] = arr[mid] ; 8 arr[mid] = arr[i] ; 9 } 10 11 for(int j = mid + 1 ; j < len ; j++){ 12 if(arr[j] < arr[j-1]){ 13 temp = arr[j] ; 14 arr[j] = arr[j-1] ; 15 arr[j-1] = arr[j] ; 16 }else{ 17 break ; 18 } 19 } 20 }
