Dlaczego Merge Sort Połączmy function () mają warunkową drugą pętlę?

głosy
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) 
    } 
}

Tak więc, w zasadzie, to na moich notatek. Uważam to za dość kłopotliwe w ogóle, ale rozumiem największą część. Co ja nie rozumiem, to jest konieczność „if (j <= niski + k - 1)” część. Wygląda na to, że sprawdza, czy są jakieś elementy „left” w lewej części. Czy to w ogóle możliwe, gdy mergesorting?

Utwórz 24/04/2010 o 00:28
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
2

Podczas łączenia dwóch posortowanych list (nazwijmy je lefta right), zachować biorąc jedną pozycję i dodanie jej do resultlisty, dopóki nie zabraknie elementów w każdej z leftlub rightlisty. Odbywa się to przez pierwszą whilepętlę. Teraz trzeba dodać elementy pozostałe po lewej lub prawej liście do listy wynikowej. Istnieją dwie opcje:

  • Listy po lewej stronie jest z elementów, a prawo lista wciąż ma jedne. Sposób, w jaki kod jest napisane, że nie musimy nic robić, ponieważ koniec Stablicy zawiera już ostatnie elementy w rightliście.

  • Prawo lista jest z elementów, a lewy lista wciąż ma jedne. Następnie kopiujemy pozostałe elementy do końca S. To jest to, co ifw końcu merge1robi.


Jeśli chodzi o Twoje pytanie, czy ten kod jest „złe”: kod jest poprawny, ale chciałbym wprowadzić pewne zmiany, aby uczynić go bardziej czytelny:

  • Opisowe nazwy zmiennych.
  • Przechodząc punkt środkowy, który rozdziela lefti rightwykazy merge1zamiast po to przeliczone.
Odpowiedział 24/04/2010 o 00:45
źródło użytkownik

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