¿Por qué Combinar la función de clasificar Merge () tiene un segundo bucle condicional?

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

Así que, básicamente, se trata de mis notas de la conferencia. Me parece bastante confuso, en general, pero entiendo la mayor parte de ella. Lo que no entiendo es la necesidad del si (j <= Baja + k - 1) parte. Parece que se comprueba si hay elementos de izquierda en la parte izquierda. Es posible que incluso cuando mergesorting?

Publicado el 24/04/2010 a las 00:28
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
2

Cuando la fusión de dos listas ordenadas (llamémosles lefty right), usted toma un elemento y agregarlo a la resultlista, hasta que se acabe de artículos, ya sea en el lefto rightlista. Esto se realiza por el primer whilebucle. Ahora es necesario agregar los elementos restantes en la lista de izquierda o derecha a la lista de resultados. Hay dos opciones:

  • La lista de la izquierda está fuera de los elementos, y la lista de la derecha todavía tiene alguna. La forma en que el código está escrito aquí, no necesita hacer nada, ya que el final de la Sserie ya contiene los últimos elementos de la rightlista.

  • La lista de la derecha está fuera de los elementos, y la lista de la izquierda todavía tiene alguna. A continuación, copiamos los elementos restantes hasta el final de S. Esto es lo que el ifal final de merge1sí.


Respecto a su pregunta si este código es "malo": El código es correcto, pero me gustaría hacer algunos cambios para que sea más legible:

  • nombres de las variables descriptivas.
  • Pasando el punto medio que separa las lefty rightlistas para merge1en vez de tenerlo vuelve a calcular.
Respondida el 24/04/2010 a las 00:45
fuente por usuario

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