Warum Merge Sort des Merge () Funktion, um eine bedingte zweite Schleife hat?

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

Also, im Grunde ist dies auf meinem Skriptum. Ich finde es ganz allgemein verwirrend, aber ich verstehe den größten Teil davon. Was ich nicht verstehe, ist die Notwendigkeit des if (j <= low + k - 1) teil. Es sieht aus wie es überprüft, ob es irgendwelche Elemente „links“ im linken Teil ist. Ist das überhaupt möglich ist, wenn mergesorting?

Veröffentlicht am 24/04/2010 um 00:28
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
2

Wenn zwei sortierte Listen Zusammenführung (nennen wir sie leftund right) halten Sie ein Element zu nehmen und es auf die Zugabe resultListe, bis Sie entweder in der aus Artikel laufen leftoder rightListe. Dies wird durch die erste getan whileSchleife. Nun müssen Sie noch in der linken oder rechten Liste in die Ergebnisliste die Elemente hinzuzufügen. Es gibt zwei Möglichkeiten:

  • Die linke Liste ist aus Elementen, die rechte Liste hat noch einige. Die Art und Weise der Code hier geschrieben wird, müssen wir nichts tun, da das Ende der SAnordnung bereits die letzten Elemente in dem enthält rightListe.

  • Die rechte Liste ist aus Elementen, und die linke Liste hat noch einige. Dann kopieren wir die übrigen Elemente bis Ende S. Dies ist , was das ifam Ende merge1tut.


Deine Frage zu, wenn dieser Code ist „schlecht“: Der Code korrekt ist, aber ich würde einige Änderungen es besser lesbar machen machen:

  • Beschreibende Variablennamen.
  • Passieren des Mittelpunktes, der die voneinander trennt leftund rightListen merge1sie neu berechnet , anstelle von.
Beantwortet am 24/04/2010 um 00:45
quelle vom benutzer

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