Menu Close

Ordenación por una fila

Las matrices se pueden representar por listas de lista. Por ejemplo, la matriz

   |1 2 5| 
   |3 0 7| 
   |9 1 6| 
   |6 4 2|

se puede representar por

   ej :: [[Int]]
   ej = [[1,2,5],
         [3,0,7],
         [9,1,6],
         [6,4,2]]

Definir la función

   ordenaPorFila :: Ord a => [[a]] -> Int -> [[a]]

tal que (ordenaPorFila xss k) es la matriz obtenida ordenando xs por los elementos de la fila k. Por ejemplo,

   ordenaPorFila ej 1  ==  [[2,1,5],[0,3,7],[1,9,6],[4,6,2]]
   ordenaPorFila ej 2  ==  [[2,5,1],[0,7,3],[1,6,9],[4,2,6]]
   ordenaPorFila ej 3  ==  [[5,2,1],[7,0,3],[6,1,9],[2,4,6]]

Soluciones

import Data.List (sort, transpose)
 
ej :: [[Int]]
ej = [[1,2,5],
      [3,0,7],
      [9,1,6],
      [6,4,2]]
 
-- 1ª solución
-- ===========
 
ordenaPorFila :: Ord a => [[a]] -> Int -> [[a]]
ordenaPorFila xss k =
  transpose (ordenaPorColumna (transpose xss) k)
 
ordenaPorColumna :: Ord a => [[a]] -> Int -> [[a]]
ordenaPorColumna xss k =
  map snd (sort [(xs!!k,xs) | xs <- xss])
 
-- 2ª solución
-- ===========
 
ordenaPorFila2 :: Ord a => [[a]] -> Int -> [[a]]
ordenaPorFila2 xss k =
  [[x | (_,x) <- sort $ zip (xss!!k) xs ] | xs <- xss]
Medio

2 soluciones de “Ordenación por una fila

  1. albcercid
    ordenaPorFila :: Ord a => [[a]] -> Int -> [[a]]
    ordenaPorFila xss k =
      [ordF a b | (a,b) <- zip (repeat (xss!!k)) xss]
      where ordF a b = map snd $ sort (zip a b)
  2. Chema Cortés
    ordenaPorFila :: Ord a => [[a]] -> Int -> [[a]]
    ordenaPorFila xss k = [ [ x | (_,x) <- sort $ zip (xss!!k) xs ] | xs <- xss ]

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.