Estaba haciendo este algoritmo para encontrar tres enteros SIN ordenar la matriz de entrada y devolver una matriz ordenada de los tres enteros más grandes en la matriz de entrada. Los duplicados están bien.
¿Hay alguna manera de resolver esto sin funciones de ayuda como lo hice yo? ¿O tal vez una solución más optimizada?
function findThreeLargestNumbers(array) { let result = [null, null, null]; for (let i = 0; i < array.length; i++) { updateLargest(result, array[i]) } return result } function updateLargest(result, num) { if (!result[2] || num > result[2]) { shiftAndUpdate(result, num, 2) } else if (!result[1] || num > result[1]) { shiftAndUpdate(result, num, 1) } else if (!result[0] || num > result[0]) { shiftAndUpdate(result, num, 0) } } function shiftAndUpdate(array, num, index) { for (let i = 0; i <= index; i++) { if (i === index) { array[i] = num; } else { array[i] = array[i + 1]; } } } console.log(findThreeLargestNumbers([141, 1, 17, -7, -17, -27, 18, 541, 8, 7, 7]));Suponiendo N ≥ 3 ,
B[0]:= A[0] # First two, sorted if A[1] ≥ A[0] B[1]:= B[0]; B[0]:= A[1] else B[1]:= A[1] # First three, sorted if A[2] ≥ A[1] B[2]:= B[1] if A[2] ≥ A[0] B[1]:= B[0]; B[0]:= A[2] else B[1]:= A[2] else B[2]:= A[2] # Update the largest three, sorted for i:= 3 to N-1 if A[i] ≥ A[1] B[2]:= B[1] if A[i] ≥ A[0] B[1]:= B[0]; B[0]:= A[i] else B[1]:= A[i] else if A[i] ≥ A[2] B[2]:= A[i] En el peor de los casos, comparaciones 2N-3 y movimientos 2N-1 .