De ce Merge () funcția Îmbinare Sortare au o a doua buclă condiționată?

voturi
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) 
    } 
}

Deci, practic, acest lucru este pe notele mele de curs. Mi se pare destul de confuz, în general, dar am înțeles cea mai mare parte din ea. Ceea ce nu înțeleg este nevoia de „if (j <= k + joasă - 1)“ parte. Se pare că verifică dacă există elemente de „stânga“, în partea stângă. Este chiar posibil ca atunci când mergesorting?

Întrebat 24/04/2010 la 00:28
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
2

În cazul în care fuzionează două liste triate (să le spunem leftși right), continuați să luați un singur element și adăugându - l la resultlista, până când a alerga afară de articole , fie în leftsau rightlista. Acest lucru se face prin prima whilebucla. Acum trebuie să adăugați elementele rămase în lista din stânga sau la dreapta la lista de rezultate. Există două opțiuni:

  • Lista din stânga este în afara de elemente, iar lista din dreapta are încă unele. Modul în care codul este scris aici, nu avem nevoie să faceți nimic, deoarece la sfârșitul Smatrice conține deja ultimele elemente din rightlistă.

  • Lista dreapta este în afara de elemente, iar lista din stânga are încă unele. Apoi vom copia elementele rămase până la sfârșitul anului S. Aceasta este ceea ce ifla sfârșitul merge1face.


În ceea ce privește întrebarea dacă acest cod este „rău“: Codul este corect, dar mi-ar face unele modificări pentru a face mai ușor de citit:

  • numele variabilelor descriptive.
  • Trecând punctul de mijloc care separă leftși rightlistele la merge1loc de a fi ea recalculate.
Publicat 24/04/2010 la 00:45
sursa de către utilizator

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