Neden sırala en Birleştirme () işlevi, bir koşullu ikinci döngü var Birleştirme mu?

oy
1
merge1(int low, int high, int S[], U[]) 
{ 
    int k = (high - low + 1)/2
    for q (from low to high) U[q] = S[q]
    int j = low 
    int p = low 
    int i = low + k 

    while (j <= low + k - 1) and (i <= high) do 
    { 
        if ( U[j] <= U[i] ) 
        {
            S[p] := U[j] 
            j := j+1
        } 
        else 
        { 
            S[p] := U[i] 
            i := i+1 
        } 
        p := p+1 
    } 

    if (j <= low + k - 1) 
    { 
        for q from p to high do 
        { 
            S[q] := U[j] 
            j := j+1 
        } 
    }
}


merge_sort1(int low, int high, int S[], U[]) 
{ 
    if low < high 
    { 
        int k := (high - low + 1)/2 
        merge_sort1(low, low+k-1, S, U) 
        merge_sort1(low+k, high, S, U) 
        merge1(low, high, S, U) 
    } 
}

Yani öncelikle bu benim ders notları üzerindedir. Ben genel olarak oldukça kafa karıştırıcı buluyorum ama bunun büyük bir parçamı anlıyoruz. bölüm - Ya anlamıyorum eğer (1 j <= düşük + k) nin ihtiyacıdır. sol kısmında sol Herhangi unsur vardır eğer denetler gibi görünüyor. O mergesorting bile mümkün mü?

Oluştur 24/04/2010 saat 00:28
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
2

İki sıralı liste birleştirirken (Onları diyelim leftve right, bir öğeyi alıp eklemeden tutun) resultya öğelerin bitene kadar, listede leftveya rightlistede. Bu ilk yapılır whiledöngü. Şimdi sonuç listesine sol veya sağ listede kalan unsurları eklemeniz gerekir. İki seçenek vardır:

  • Sol liste elemanlarının dışında ve sağ liste hala bazı vardır. Sonu beri kod burada yazılır yolu, biz bir şey yapmak gerekmez Sdizideki zaten son öğeleri içerir rightlistede.

  • Sağ liste elemanlarının dışında ve sol liste hala bazı vardır. Sonra sonuna kadar kalan unsurları kopyalamak S. Bu nedir ifsonunda merge1yapar.


Kodun doğru, ama bazı değişiklikler daha okunabilir hale getirmek için yapacağı: Sorunuzu İlişkin bu kod "kötü" ise:

  • Açıklayıcı değişken isimler.
  • Ayıran orta nokta Geçme leftve rightlisteleri merge1yeniden hesaplanması ettikten yerine.
Cevap 24/04/2010 saat 00:45
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more