2015-12-21 73 views
3

合併排序。錯誤合併排序輸出

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package algorithms; 

import java.util.Arrays; 

/** 
* 
* @author Navin 
*/ 
public class MergeSort { 

    int [] left; 
    int [] right; 

    public void Merge_Sort(int [] array){ 
     if(array.length<2){ 
      return; 
     }  

     int mid = array.length/2; 
     left = new int[mid]; 
     right = new int[array.length-mid]; 

     for(int i =0;i<mid;i++){ 
      left[i] = array[i]; 
     } 

     for(int j =mid;j<array.length;j++){ 
      right[j-mid] = array[j]; 

     } 

     System.out.println(Arrays.toString(left)); 
     System.out.println(Arrays.toString(right)); 

     Merge_Sort(left); 
     Merge_Sort(right); 
     Merge(left,right,array); 
    }  


    public void Merge(int [] left, int [] right, int [] array){ 

     int i=0; 
     int j=0; 
     int k=0; 

     while(i<left.length && j<right.length){ 

      if(left[i] < right[j]){ 
       array[k] = left[i]; 
       i++; 
      }else{ 
       array[k] = right[j]; 
       j++; 
      } 
      k++; 
     } 

    } 

    public static void main(String[] args) { 
     int [] array = {2,4,1,6,8,5,3,7}; 
     MergeSort ms = new MergeSort(); 

     ms.Merge_Sort(array); 
     System.out.println(Arrays.toString(array)); 
    } 
} 

我不知道這有什麼錯以上的邏輯和實現是正確的,但輸出是一個排序的數組,這是一樣的輸入。

輸出: [2,4,1,6,8,5,3,7]

+1

我在這裏沒有看到任何插入排序。 –

+0

@naveenath你是要求插入排序還是合併排序? –

+0

您使用函數作爲Merge_sort(不與Java標準)和有關插入排序的問題? – Avinash

回答

2

我測試你的代碼,你的合併方法是錯誤的。使用此代碼和所有應罰款:

public void merge(int[] left, int[] right, int[] array) { 
    int i = 0, j = 0, k = 0; 

    while (i < left.length && j < right.length) { 
     if (left[i] < right[j]) 
      array[k++] = left[i++]; 
     else   
      array[k++] = right[j++];    
    } 

    while (i < left.length) 
     array[k++] = left[i++]; 

    while (j < right.length)  
     array[k++] = right[j++]; 

    return; 
} 

閱讀this great SO post關於如何在Java中合併兩個有序陣列的信息。

0

這裏是合併排序的一個完整的Java實現。

public void mergeSort(int[] a) { 
    int n = a.length; 

    // Base case for partitioning 
    // Array with single element is already sorted 
    if (n == 1) 
    return; 

    int middle = n/2; 
    // Create sub arrays 
    int[] left = new int[middle]; 
    int[] right = new int[n - middle]; 

    // Fill sub arrays 
    for (int i = 0; i < middle; i++) { 
    left[i] = a[i]; 
    } 
    for (int i = middle; i < n; i++) { 
    right[i - middle] = a[i]; 
    } 

    // recursively partition until 1 element is there 
    mergeSort(left); 
    mergeSort(right); 

    // Merge sub arrays 
    Merge(left, right, a); 

} 

public void Merge(int[] left, int[] right, int[] a) { 

    int leftArrItems = left.length; 
    int rightArrItems = right.length; 

    // i for left array looping 
    // j for right array looping 
    // k for a array looping 
    int i = 0; 
    int j = 0; 
    int k = 0; 

    while (i < leftArrItems && j < rightArrItems) { 

    // Decides from what sub array to pick to fill final array 
    if (left[i] < right[j]) { 
    a[k++] = left[i++]; 
    } else { 
    a[k++] = right[j++]; 
    } 
    } 

    // Just in case if any sub array is left over 
    // with additional elements 
    while (i < leftArrItems) { 
    a[k++] = left[i++]; 
    } 
    while (j < rightArrItems) { 
    a[k++] = right[j++]; 
    } 

} 

你可以看到背後的邏輯歸併排序here

+1

將嘗試出隊友 – naveenath

+1

@Kalpa爲了將來的參考,一個好的堆棧溢出的答案是直接解決這個問題。雖然粘貼合併排序的正確實現並沒有錯,但它並不一定會爲提問者提供任何價值。 –

+0

謝謝您的建議Tim。 –