2014-03-25 27 views
2

合併排序算法減少了2個數字集合中的原始數組,並將2個集合(1個集合×1個集合)之後,2個集合之後,2個2個,3個3個等等之後放在最後。排序。 問題是:如果第二個mergeSort(),當調用mergeSort()和merge時,該算法(Java中的實現)如何對數組進行排序,而不是將輸出分配給數組?返回值如何合併排序

我所說的算法:

int[] a = {4 , 8, 19, 7}; 
int[] sorted_array = mergeSort(a, 0, a.length-1); 

static void mergeSort(int[] a) 
{ 
    return mergeSort(a, 0, a.length - 1); 
} 

static int[] mergeSort(int[] a, int i, int f) 
{ 
    if(i < f) 
    { 
     int h = (f + i)/2; 
     mergeSort(a, i, h); 
     mergeSort(a, h + 1, f); 
     merge(a, i, h, f); 
    } 
return a; 
} 

static void merge(int[] a, int i, int h, int f) 
{ 
    int[] aux = new int[f - i + 1]; 
    int k = 0, iaux = i, jaux = h + 1, kaux; 

while(iaux <= h && jaux <= f) 
{ 
    if(a[iaux] < a[jaux]) 
    { 
     aux[k] = a[iaux]; 
     iaux++; 
    } 
    else 
    { 
     aux[k] = a[jaux]; 
     jaux++; 
    } 

    k++; 
} 

while(iaux <= h) 
{ 
    aux[k] = a[iaux]; 
    iaux++; 
    k++; 
} 

while(jaux <= f) 
{ 
    aux[k] = a[jaux]; 
    jaux++; 
    k++; 
} 

kaux = 0; 

for(iaux = i; iaux <= f; iaux++) 
{ 
    a[iaux] = aux[kaux]; 
    kaux++; 
} 

}

謝謝。

+1

我認爲你的意思是懷疑而不是兄弟。 – DguezTorresEmmanuel

+0

哦,是的,我的英語... 謝謝。 – user3270009

+0

[是Java的「傳遞引用」?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference)可能的重複(不是重複的意思,它是相同的問題,而是大概這個答案會回答你的問題)。 – Dukeling

回答

2

在Java中,所有東西都是按值傳遞的。但重要的是要知道,這個價值是多少!

不是原始數據類型(int,boolean等)的每個變量都包含對對象的引用。

在這一行int[] a = {4 , 8, 19, 7};中,您將創建新的數組,並將此對象的引用存儲在變量a中。

如果您調用此方法mergeSort(a, 0, a.length-1);,則將引用該數組的變量a的值複製到該方法(第二個和第三個參數是基元數據類型,其值是複製的,而不是引用)。因此在mergeSort方法中,它直接訪問相同的數組。

+0

Java不能通過引用傳遞變量。 但我不知道merge()如何返回值。理論上,merge()會丟失數組,離開方法。 – user3270009

+0

@ user3270009 - 複製引用(Java)或傳遞引用(C++)之間有區別。 Java複製對象的引用,而不是引用變量。在這種情況下,這意味着,兩個變量 - 主方法中的「a」和mergeSort方法中的「a」都引用相同的對象(但是在通過引用傳遞時不會像C++中那樣相互引用) – libik

1

我只掠過代碼,但它似乎修改了輸入數組。這意味着,如果你這樣稱呼它

int[] a = {4, 8, 19, 7}; 
mergeSort(a, 0, a.length-1); 

,然後你檢查的a的內容,你會發現它是{4, 7, 8, 19}。如果您在mergeSort函數的末尾刪除return a;,它仍然會工作。再次返回a對於調用者來說只是一個方便。

mergeSortmerge的內部調用依賴於此屬性。

在評論你問如何這麼做是:關鍵部分是在merge

for(iaux = i; iaux <= f; iaux++) 
{ 
    a[iaux] = aux[kaux]; 
    kaux++; 
} 

最後一刻被寫入a陣列循環。

+0

但是,當我合併()集合,結果不會保存!我可以返回一個,但數組a,理論上不會改變。 – user3270009

+0

以下情況之一是正確的:您錯誤地認爲結果未被保存,「合併」是錯誤的,或者我不知道您的反對意味着什麼。 – zwol

+0

我這樣做:int [] sorted_array = mergeSort(a,0,a。長度-1);並且第一個mergeSort將劃分爲2個數字的集合,第二個mergeSort()將分成2個數字的集合(或1個作爲缺陷),merge()將對2個集合進行排序,並且數組a不會回。那麼,數組如何保存排序後的數組呢? – user3270009