Hvorfor flettesortering er Merge () -funksjonen har en betinget andre loop?

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

Så, i utgangspunktet, er dette på mine forelesningsnotater. Jeg synes det er ganske forvirrende generelt, men jeg forstår den største delen av det. Det jeg ikke forstår er behovet for if (j <= lav + k - 1) en del. Det ser ut som den sjekker om det er noen elementer venstre i den venstre delen. Er det også mulig når mergesorting?

Publisert på 23/04/2010 klokken 23:28
kilden bruker
På andre språk...                            


1 svar

stemmer
2

Når du slår sammen to sorterte lister (la oss kalle dem leftog right), holder du tar ett element og legge det til resultlisten, før du kjører ut av elementer i enten lefteller rightliste. Dette gjøres ved den første whilesløyfen. Nå må du legge til elementer igjen i venstre eller høyre liste til resultatlisten. Det er to alternativer:

  • Listen til venstre er ute av elementer, og retten liste fremdeles har noen. Måten koden er skrevet her, trenger vi ikke å gjøre noe, siden slutten av Smatrisen allerede inneholder de siste elementene i rightlisten.

  • Retten listen er ute av elementer, og listen til venstre fortsatt har noen. Deretter kopierer vi de resterende elementene til slutten av S. Dette er hva ifpå slutten av merge1gjør.


Når det gjelder ditt spørsmål om denne koden er "dårlig": Koden er riktig, men jeg ville gjøre noen endringer for å gjøre den mer lesbar:

  • Beskrivende variabelnavn.
  • Passerer midtpunktet som skiller leftog rightliste til merge1stedet for å ha den beregnet på nytt.
Svarte 23/04/2010 kl. 23:45
kilden bruker

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