Prácticas, Encontrar segundo valor máximo de una lista

¿Cómo encontrar el segundo valor máximo de una lista?

Para encontrar el segundo valor máximo de una lista utilizamos el siguiente algoritmo.

def segundo_valor_maximo(A):
    primero = 0
    segundo = 0

    if A[0] > A[1]
        primero, segundo = A[0], A[1]
    else
        primero, segundo = A[1], A[0]

    for i = 2 to len(A)
        if A[i] > primero
            primero, segundo = A[i], primero
        else if A[i] > segundo
            segundo = A[i]

    return segundo

Ahora implementamos el pseudocódigo en Go.

package main

import "fmt"

// creamos un tipo personalizado para la lista
type Nums []int

// agregamos una funcion para calcular el máximo
func (nums Nums) SegundoMaximo() int {

	// creamos variables contenedoras para el
	// primero y segundo maximos
	var primero, segundo int

	// ordenamos primero y segundo segun su maximo
	if nums[0] > nums[1] {
		primero, segundo = nums[0], nums[1]
	} else {
		primero, segundo = nums[1], nums[0]
	}

	// recorremos de i = 2 hasta len(nums)
	for i := 2; i < len(nums); i++ {

		// si el item iterado es mayor que primero
		// recorremos los valores de primero y segundo
		// si solo es mayor que segundo
		// solo actualizamos segundo
		if nums[i] > primero {
			primero, segundo = nums[i], primero
		} else if nums[i] > segundo {
			segundo = nums[i]
		}
	}

	// retornamos segundo
	return segundo

}

func main() {

	nums := Nums{81, 18, 23, 57, 46, 26, 63, 35, 6, 49}

	fmt.Println("El segundo numero mayor es:", nums.SegundoMaximo())

}

Salida.

El segundo numero mayor es: 63

La clave para entender este algoritmo es entender que podemos realizar un desplazamiento secuencial utilizando la sintaxis de asignación múltiple primero, segundo = A[i], primero.