Pourquoi la fonction de fusion de fusion () EISO ont une deuxième boucle conditionnelle?

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

Donc, en gros, c'est sur mes notes de cours. Je trouve cela assez déroutant en général, mais je comprends la plus grande partie de celui-ci. Ce que je ne comprends pas la nécessité du « if (j <= k faible + - 1) » partie. On dirait qu'il vérifie s'il y a des éléments « gauche » dans la partie gauche. Est-ce même possible quand mergesorting?

Créé 24/04/2010 à 00:28
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Lors de la fusion de deux listes triées (nous allons les appeler leftet right), vous continuez à prendre un article et l' ajouter à la resultliste, jusqu'à ce que vous manquez d'articles soit dans la leftou rightliste. Cela se fait par la première whileboucle. Maintenant , vous devez ajouter les autres éléments dans la liste de gauche ou de droite à la liste des résultats. Il y a deux options:

  • La liste de gauche est hors éléments, et la liste de droite a encore quelques - uns. La façon dont le code est écrit ici, on n'a pas besoin de faire quoi que ce soit, depuis la fin du Stableau contient déjà les derniers éléments de la rightliste.

  • La liste de droite est hors éléments, et la liste de gauche a encore quelques - uns. Ensuite , nous copions les éléments restants à la fin S. C'est ce que ifà la fin de merge1fait.


En ce qui concerne votre question si ce code est « mauvais »: Le code est correct, mais je faire quelques changements pour le rendre plus lisible:

  • noms de variables descriptives.
  • En passant le milieu qui sépare les leftet rightlistes au merge1lieu de l' avoir recalculé.
Créé 24/04/2010 à 00:45
source utilisateur

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