Proč sloučit funkce Uspořádat to Merge () mají podmíněnou druhou smyčku?

hlasů
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že, v podstatě se jedná o mé skript. Připadá mi to docela matoucí obecně, ale chápu největší část. To, co nechápu, je potřeba na if (j <= low + K - 1) část. Vypadá to, že zkontroluje, zda existují nějaké prvky „levice“ v levé části. Je to vůbec možné, když mergesorting?

Položena 24/04/2010 v 00:28
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Při slučování dvou tříděných seznamů (říkejme jim lefta right), můžete pokračovat v užívání jednu položku a přidat ji do resultseznamu, dokud vám dojdou kusů buď leftnebo rightseznamu. To se provádí v prvním whileokruhu. Nyní je potřeba přidat prvky zbývající do levého nebo pravého seznamu do výsledkové listiny. Existují dvě možnosti:

  • V levém seznamu je mimo prvků a pravý seznam obsahuje ještě něco navíc. Způsob, jakým kód je zde napsáno, nepotřebujeme nic dělat, protože konec Spole již obsahuje poslední prvky v rightseznamu.

  • Vpravo je seznam je z prvků, a nechal seznam má ještě něco navíc. Pak jsme zkopírovat zbývající prvky až do konce S. To je to, co ifna konci merge1dělá.


Pokud jde o vaši otázku, zda tento kód je „špatný“: Tento kód je správný, ale já bych udělat nějaké změny, aby bylo lépe čitelné:

  • Popisné názvy proměnných.
  • Předávání střed, který odděluje lefta rightseznamy na merge1místo toho, aby je přepočítána.
Odpovězeno 24/04/2010 v 00:45
zdroj uživatelem

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