elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  ordenar matriz
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ordenar matriz  (Leído 2,199 veces)
~H~

Desconectado Desconectado

Mensajes: 22



Ver Perfil
ordenar matriz
« en: 4 Noviembre 2013, 15:33 pm »

Bueno me gustaría saber si alguien sabe hacer este programa de una manera más rápida, es decir un algoritmo que la ordene sin tener que pasarlo a monodimensional y luego volver a meter los elementos en la matriz.
Me refiero al método ordenaMatriz, porque el otro creo que está bien, el programa funciona, pero creo que no es la forma adecuada de hacerlo.

Gracias de antemano

Código:
import java.util.Scanner;

public class ordenar {
public static int [] ordenarVector (int n[]){
int aux = 0;
int ordenado [] = new int [n.length];
for(int i = 0; i < n.length - 1; i++){
for(int k = i + 1; k < n.length; k++){
if(n[k] < n[i]){
aux = n[i];
n[i] = n[k];
n[k] = aux;
}
}
}
return ordenado;
}
public static int [][] ordenarMatriz (int n[][]){

int vectorAux [] = new int [n.length * n[0].length];
int contAux = 0;

/*Rellenamos el vector auxiliar con los elementos
*de la matriz para poder ordenarlo.
*/
for(int k = 0; k < n.length; k++){
for(int l = 0; l < n[k].length; l++){
vectorAux[contAux] = n[k][l];
contAux++;
}
}

int aux = 0;
for(int i = 0; i < vectorAux.length - 1; i++){
for(int j = i + 1; j < vectorAux.length; j++){
if(vectorAux[j] < vectorAux[i]){
aux = vectorAux[i];
vectorAux[i] = vectorAux[j];
vectorAux[j] = aux;
}
}
}
//Ponemos los valores ordenados de nuevo en la matriz.
int cont = 0;
for(int k = 0; k < n.length; k++){
for(int l = 0; l < n[k].length; l++){
n[k][l] = vectorAux[cont];
cont++;
}
}
return n;
}
public static void mostrarVector(int array[]){
for(int i = 0; i < array.length; i++){
System.out.print(array[i]);
}
System.out.println();
}
public static void pedirElementos(int array []){
Scanner leer = new Scanner(System.in);
for(int i = 0; i < array.length; i++){
System.out.print("Elemento ["+i+"]:" );
array [i] = leer.nextInt();
}
}
public static void pedirElementosBi(int array [][]){
Scanner leer = new Scanner(System.in);
for(int i = 0; i < array.length; i++){
for(int j = 0; j < array[i].length;j++){
System.out.print("Elemento ["+i+j+"]:" );
array [i][j] = leer.nextInt();
}
}
}
public static void mostrarMatriz(int array [][]){
for(int i = 0; i < array.length; i++){
for(int j = 0; j < array[i].length;j++){
System.out.print(array[i][j]+" ");
}
System.out.println();
}
}
public static void main(String [] args){
Scanner leer = new Scanner (System.in);
System.out.println("Ordenar arrays");
System.out.println("1-monodimensional");
System.out.println("2-bidimensional");
int x = leer.nextInt();
switch(x){
case 1:
System.out.println("Longuitud del vector");
int n = leer.nextInt();
int vector [] = new int [n];
pedirElementos(vector);
System.out.println();
mostrarVector(vector);
int [] ordenado = ordenarVector(vector);
mostrarVector(ordenado);

break;
case 2:
System.out.println("Filas");
int nF = leer.nextInt();
System.out.println("Columnas");
int nC = leer.nextInt();
int matriz [][] = new int [nF][nC];
pedirElementosBi(matriz);
System.out.println();
int [][] matrizOrdenada = ordenarMatriz(matriz);
mostrarMatriz(matrizOrdenada);
break;

default:
System.out.println("Un 1 o un 2 imbécil");
}
}
}


En línea

egyware


Desconectado Desconectado

Mensajes: 526



Ver Perfil WWW
Re: ordenar matriz
« Respuesta #1 en: 4 Noviembre 2013, 15:52 pm »

Solo al ver tu problema, se me ocurrieron muchas maneras de resolverlo.

Aunque lo primero que haría es demostrar cuando se demora tu problema en general. Si es que aún tienes intenciones de encontrar una manera más eficiente.

Dada una matriz m y n dimensiones y l el largo del vector donde l = m*n.

  • Pasar matriz a vector tiene un costo de O(m*n)
  • Ordenar vector tiene un costo O(l^2) (me da la impresión que usas burbuja, por el ciclo for anidado)
  • Pasar el vector a matriz tiene un costo de O(m*n)

En total, tu algoritmo tiene un costo de...  2 * O(m*n) + O((m*n)^2) osea O((m*n)^2)
Por lo que podemos apreciar lo más costoso, es ordenar el arreglo. Podrías usar Quicksort para hacerlo más eficiente.

Bueno con esto podrías empezar a buscar métodos más eficientes para tu algoritmo.

Saludos!


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ordenar matriz alfabeticamente
Programación C/C++
programacion_c 7 11,122 Último mensaje 25 Abril 2012, 00:19 am
por david_BS
Ordenar una matriz sin repetir numeros.
Programación C/C++
veravluis 5 4,732 Último mensaje 25 Abril 2016, 00:29 am
por MAFUS
Problema Ordenar Matriz
Programación C/C++
Decay15 3 3,041 Último mensaje 26 Mayo 2016, 23:36 pm
por AlbertoBSD
(python) como ordenar matriz?
Scripting
horacio_b92 5 10,876 Último mensaje 7 Enero 2017, 21:19 pm
por jairoes
Ordenar una matriz en C?
Programación C/C++
palacio29 0 9,647 Último mensaje 6 Septiembre 2016, 01:06 am
por palacio29
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines