對兩個有序數組進行合並


問題描述:

  數組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),空間復雜度滿足條件。

 

方法三

  本方法的思路有點類似簡單排序的,具體思路如下:

  1. 遍歷數組中下標為0~mid-1的元素,將遍歷到的元素的值與arr[mid]比較,若arr[i]大於arr[mid],則交換,即第i次排序,將其最右邊的最小的值放到arr[i]的位子上,
  2. 然后在后半段中將arr[mid]排序到正常的位置上去。
  3.  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         }

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM