Waarom heeft Merge Merge () functie Sort hebben een voorwaardelijke tweede lus?

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

Dus, in principe, dit is op mijn dictaten. Ik vind het nogal verwarrend in het algemeen, maar ik begrijp het grootste deel van uit. Wat ik niet begrijp is de behoefte van de if (j <= laag + k - 1) deel. Het lijkt erop dat controleert of er nog elementen links in het linker gedeelte. Is dat zelfs mogelijk wanneer mergesorting?

De vraag is gesteld op 24/04/2010 om 00:28
bron van user
In andere talen...                            


1 antwoorden

stemmen
2

Bij het samenvoegen van twee gesorteerde lijsten (laten we noemen hen leften right), je blijft het nemen van een item en toe te voegen aan de resultlijst, totdat je geen items in zowel de aanloop leftof rightlijst. Dit gebeurt door de eerste whilelus. Nu moet je de elementen die nog in de linker of rechter lijst om de lijst met resultaten toe te voegen. Er zijn twee opties:

  • De linkse lijst is uit elementen, en de juiste lijst heeft nog een aantal. De manier waarop de code wordt hier geschreven, hoeven we niet om iets te doen, sinds het einde van de Sreeks alweer de laatste elementen in de bevat rightlijst.

  • De rechter lijst is uit elementen, en de linker lijst heeft nog een aantal. Kopieer dan we de resterende elementen aan het einde van S. Dit is wat het ifaan het eind van merge1doet.


Wat betreft uw vraag of deze code is "slecht": de code correct is, maar ik zou een aantal wijzigingen in het beter leesbaar te maken:

  • Beschrijvende namen van variabelen.
  • Het behalen van het middelpunt, die het scheidt leften rightlijsten merge1in plaats van het hebben van het opnieuw berekend.
antwoordde op 24/04/2010 om 00:45
bron van user

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