Ordenar una matriz en Java

170

Estoy tratando de hacer un programa que consista en una matriz de 10 enteros que tengan un valor aleatorio, hasta ahora muy bueno.

Sin embargo, ahora necesito ordenarlos en orden de menor a mayor valor y luego imprimirlos en la pantalla, ¿cómo lo haría?

(Perdón por tener tanto código para un programa tan pequeño, no soy tan bueno con los bucles, acabo de comenzar a trabajar con Java)

public static void main(String args[])
{
    int [] array = new int[10];

    array[0] = ((int)(Math.random()*100+1));
    array[1] = ((int)(Math.random()*100+1));
    array[2] = ((int)(Math.random()*100+1));
    array[3] = ((int)(Math.random()*100+1));
    array[4] = ((int)(Math.random()*100+1));
    array[5] = ((int)(Math.random()*100+1));
    array[6] = ((int)(Math.random()*100+1));
    array[7] = ((int)(Math.random()*100+1));
    array[8] = ((int)(Math.random()*100+1));
    array[9] = ((int)(Math.random()*100+1));

    System.out.println(array[0] +" " + array[1] +" " + array[2] +" " + array[3]
    +" " + array[4] +" " + array[5]+" " + array[6]+" " + array[7]+" " 
    + array[8]+" " + array[9] );        

}
Lukas
fuente
1
Java 8: stackoverflow.com/a/47811965/1216775
akhil_mittal

Respuestas:

206

Los bucles también son muy útiles para aprender, especialmente cuando se usan matrices,

int[] array = new int[10];
Random rand = new Random();
for (int i = 0; i < array.length; i++)
    array[i] = rand.nextInt(100) + 1;
Arrays.sort(array);
System.out.println(Arrays.toString(array));
// in reverse order
for (int i = array.length - 1; i >= 0; i--)
    System.out.print(array[i] + " ");
System.out.println();
Peter Lawrey
fuente
199

Agregue la línea antes de println y su matriz se ordenará

Arrays.sort( array );
Rauschen
fuente
11
¿Podría obtener un ejemplo de cómo usarlo en mi programa?
Lukas
41

Puede ayudarlo a comprender los bucles al implementarse usted mismo. Ver Bubble sort es fácil de entender:

public void bubbleSort(int[] array) {
    boolean swapped = true;
    int j = 0;
    int tmp;
    while (swapped) {
        swapped = false;
        j++;
        for (int i = 0; i < array.length - j; i++) {
            if (array[i] > array[i + 1]) {
                tmp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = tmp;
                swapped = true;
            }
        }
    }
}

Por supuesto, no debe usarlo en producción ya que existen mejores algoritmos de rendimiento para listas grandes como QuickSort o MergeSort que implementanArrays.sort(array)

isah
fuente
BubbleSort es definitivamente un buen algoritmo para que los principiantes aprendan, pero como mencionó QuickSort o MergeSort funcionan mucho mejor para conjuntos de datos más grandes y esos son los algoritmos utilizados por el método Arrays.sort (array) por este motivo. Gracias por mencionar esto a cualquiera que no se haya dado cuenta.
h0r53
Voto esta respuesta, ya que es más probable que los principiantes la busquen y los principiantes deberían saber cómo implementar una función de clasificación por sí mismos.
Carrm
Dado que la pregunta inicial es sobre la ordenación de una matriz de 10 enteros, la ordenación de burbujas es totalmente aceptable. Producción o no si no se espera tener un mayor aporte.
Andrew
24

Eche un vistazo a Arrays.sort ()

uzilan
fuente
2
¿Podría obtener un ejemplo de cómo usarlo en mi programa?
Lukas
20

Fui vago y agregué los bucles

import java.util.Arrays;


public class Sort {
    public static void main(String args[])
    {
        int [] array = new int[10];
        for ( int i = 0 ; i < array.length ; i++ ) {
            array[i] = ((int)(Math.random()*100+1));
        }
        Arrays.sort( array );
        for ( int i = 0 ; i < array.length ; i++ ) {
            System.out.println(array[i]);
        }
    }
}

Su matriz tiene una longitud de 10. Necesita una variable ( i) que toma los valores de 0a 9.

for ( int i = 0  ; i < array.length ;   i++ ) 
       ^               ^                   ^
       |               |                   ------  increment ( i = i + 1 )
       |               |
       |               +-------------------------- repeat as long i < 10
       +------------------------------------------ start value of i


Arrays.sort( array );

Es una biblioteca de métodos que ordena las matrices.

apilador
fuente
17
Arrays.sort(yourArray)

hará el trabajo perfectamente

Guillaume Slashy
fuente
7

Vea a continuación, le dará orden ascendente y descendente

import java.util.Arrays;
import java.util.Collections;

public class SortTestArray {

/**
 * Example method for sorting an Integer array
 * in reverse & normal order.
 */
public void sortIntArrayReverseOrder() {

    Integer[] arrayToSort = new Integer[] {
        new Integer(48),
        new Integer(5),
        new Integer(89),
        new Integer(80),
        new Integer(81),
        new Integer(23),
        new Integer(45),
        new Integer(16),
        new Integer(2)
    };

    System.out.print("General Order is    : ");

    for (Integer i : arrayToSort) {
        System.out.print(i.intValue() + " ");
    }


    Arrays.sort(arrayToSort);

    System.out.print("\n\nAscending Order is  : ");

    for (Integer i : arrayToSort) {
        System.out.print(i.intValue() + " ");
    }


    Arrays.sort(arrayToSort, Collections.reverseOrder());
    System.out.print("\n\nDescinding Order is : ");
    for (Integer i : arrayToSort) {
        System.out.print(i.intValue() + " ");
    }

}


/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    SortTestArray SortTestArray = new SortTestArray();
    SortTestArray.sortIntArrayReverseOrder();
}}

La salida será

General Order is    : 48 5 89 80 81 23 45 16 2 

Ascending Order is  : 2 5 16 23 45 48 80 81 89 

Descinding Order is : 89 81 80 48 45 23 16 5 2 

Nota: Puede usar Math.ranodm en lugar de agregar números manuales. Avísame si necesito cambiar el código ...

Buena suerte ... ¡Salud!

Fahim Parkar
fuente
No debe usar Integercuando puede usar int, ya que hacerlo provocará lentitud.
JonasCz - Restablece a Mónica el
7
int[] array = {2, 3, 4, 5, 3, 4, 2, 34, 2, 56, 98, 32, 54};

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array.length; j++) {
        if (array[i] < array[j]) {
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
}
Garrett O'Grady
fuente
6

Aquí está cómo usar esto en su programa:

public static void main(String args[])
{
    int [] array = new int[10];

    array[0] = ((int)(Math.random()*100+1));
    array[1] = ((int)(Math.random()*100+1));
    array[2] = ((int)(Math.random()*100+1));
    array[3] = ((int)(Math.random()*100+1));
    array[4] = ((int)(Math.random()*100+1));
    array[5] = ((int)(Math.random()*100+1));
    array[6] = ((int)(Math.random()*100+1));
    array[7] = ((int)(Math.random()*100+1));
    array[8] = ((int)(Math.random()*100+1));
    array[9] = ((int)(Math.random()*100+1));

    Arrays.sort(array); 

    System.out.println(array[0] +" " + array[1] +" " + array[2] +" " + array[3]
    +" " + array[4] +" " + array[5]+" " + array[6]+" " + array[7]+" " 
    + array[8]+" " + array[9] );        

}
Mármol Nublado
fuente
6

solo para su información, ahora puede usar la nueva API de Java 8 para ordenar cualquier tipo de matriz usando parallelSort

parallelSort utiliza el marco de Fork / Join introducido en Java 7 para asignar las tareas de clasificación a varios subprocesos disponibles en el grupo de subprocesos.

los dos métodos que se pueden usar para ordenar la intmatriz,

parallelSort(int[] a)
parallelSort(int[] a,int fromIndex,int toIndex)
Sufiyan Ghori
fuente
6

Por orden natural: Arrays.sort(array)

Para el orden inverso: Arrays.sort(array, Collections.reverseOrder());-> Es un método estático en la clase Colecciones que además llamará a una clase interna de sí mismo para devolver un Comparador inverso.

AalekhG
fuente
1
La solución inversa no funciona para las primitivas, desafortunadamente. IntStream.range (0, tamaño) .map (i -> array [tamaño-i-1]). ToArray (); hace. size = array.length;
Andrei Konstantinov
5

Puede ordenar una matriz int con Arrays.sort( array ).

x4u
fuente
¿Podría obtener un ejemplo de cómo usarlo en mi programa?
Lukas
5

Java 8 ofrece la opción de usar flujos que se pueden usar para ordenar int[] arraycomo:

int[] sorted = Arrays.stream(array).sorted().toArray(); // option 1
Arrays.parallelSort(array); //option 2

Como se menciona en el documento para parallelSort:

El algoritmo de clasificación es una combinación de clasificación paralela que divide la matriz en sub-matrices que se ordenan y luego fusionan. Cuando la longitud de la matriz secundaria alcanza una granularidad mínima, la matriz secundaria se ordena utilizando el método Arrays.sort apropiado. Si la longitud de la matriz especificada es menor que la granularidad mínima, se ordena utilizando el método Arrays.sort apropiado. El algoritmo requiere un espacio de trabajo no mayor que el tamaño de la matriz original. El grupo común de ForkJoin se usa para ejecutar cualquier tarea paralela.

Entonces, si la matriz de entrada es menor que la granularidad (8192 elementos en Java 9 y 4096 en Java 8, creo), parallelSortsimplemente llama al algoritmo de ordenación secuencial.

En caso de que queramos revertir la ordenación de la matriz entera, podemos hacer uso del comparador como:

int[] reverseSorted = IntStream.of(array).boxed()
                        .sorted(Comparator.reverseOrder()).mapToInt(i -> i).toArray();

Como Java no tiene forma de ordenar primitivas con un comparador personalizado, tenemos que usar el boxeo intermedio o alguna otra biblioteca de terceros que implemente dicha ordenación primitiva.

akhil_mittal
fuente
¿Por qué no utilizar un método simple (de Java 1.2) como este: Arrays.sort (myArray); ? No necesita Java Stream.
a_subscriber
3

Puede usar la función Arrays.sort () .

sort() method is a java.util.Arrays class method.          
Declaration : Arrays.sort(arrName)
rashedcs
fuente
0

¡LA MANERA MÁS EFICAZ!

public static void main(String args[])
{
    int [] array = new int[10];//creates an array named array to hold 10 int's
    for(int x: array)//for-each loop!
      x = ((int)(Math.random()*100+1));
    Array.sort(array);
    for(int x: array)
      System.out.println(x+" ");
}
max johnson
fuente
1
¡Esto no funciona! El primer bucle solo está mutando las variables del bucle (x) y los elementos de la matriz no se están configurando. Entonces, terminarás ordenando una matriz de ceros.
rrufai
0

Si desea construir el algoritmo de ordenación rápida usted mismo y comprender mejor cómo funciona, consulte el siguiente código:

1- Crear clase de clasificación

class QuickSort {
    private int input[];
    private int length;

    public void sort(int[] numbers) {
        if (numbers == null || numbers.length == 0) {
            return;
        }
        this.input = numbers;
        length = numbers.length;
        quickSort(0, length - 1);
    }
    /*
     * This method implements in-place quicksort algorithm recursively.
     */

    private void quickSort(int low, int high) {
        int i = low;
        int j = high;

        // pivot is middle index
        int pivot = input[low + (high - low) / 2];

        // Divide into two arrays
        while (i <= j) {
            /**
             * As shown in above image, In each iteration, we will identify a
             * number from left side which is greater then the pivot value, and
             * a number from right side which is less then the pivot value. Once
             * search is complete, we can swap both numbers.
             */
            while (input[i] < pivot) {
                i++;
            }
            while (input[j] > pivot) {
                j--;
            }
            if (i <= j) {
                swap(i, j);
                // move index to next position on both sides
                i++;
                j--;
            }
        }

        // calls quickSort() method recursively
        if (low < j) {
            quickSort(low, j);
        }

        if (i < high) {
            quickSort(i, high);
        }
    }

    private void swap(int i, int j) {
        int temp = input[i];
        input[i] = input[j];
        input[j] = temp;
    }
}

2- Envía tu matriz sin clasificar a Quicksortclase

import java.util.Arrays;


public class QuickSortDemo {

    public static void main(String args[]) {
        // unsorted integer array
        int[] unsorted = {6, 5, 3, 1, 8, 7, 2, 4};
        System.out.println("Unsorted array :" + Arrays.toString(unsorted));
        QuickSort algorithm = new QuickSort();
        // sorting integer array using quicksort algorithm
        algorithm.sort(unsorted);
        // printing sorted array
        System.out.println("Sorted array :" + Arrays.toString(unsorted));
    }
}

3- salida

Unsorted array :[6, 5, 3, 1, 8, 7, 2, 4] 
Sorted array :[1, 2, 3, 4, 5, 6, 7, 8]
Hossam Hassan
fuente
0

También podemos usar el árbol de búsqueda binario para obtener una matriz ordenada mediante el método transversal en orden. El código también tiene la implementación del árbol de búsqueda binario básico a continuación.

class Util {
    public static void printInorder(Node node) 
    { 
        if (node == null) {
            return;
        } 

        /* traverse left child */
        printInorder(node.left); 

        System.out.print(node.data + " "); 

        /* traverse right child */
        printInorder(node.right); 
     } 

    public static void sort(ArrayList<Integer> al, Node node) {
        if (node == null) {
            return;
        } 

        /* sort left child */
        sort(al, node.left); 

        al.add(node.data);

        /* sort right child */
        sort(al, node.right); 

    }
}

class Node {
    Node left;
    Integer data;
    Node right;

    public Node(Integer data) {
        this.data = data;
    }

    public void insert(Integer element) {
        if(element.equals(data)) {
            return;
        }

        // if element is less than current then we know we will insert element to left-sub-tree
        if(element < data) {
            // if this node does not have a sub tree then this is the place we insert the element.
            if(this.left == null) {
                this.left = new Node(element);  
            } else { // if it has left subtree then we should iterate again.
                this.left.insert(element);
            }
        } else {
            if(this.right == null) {
                this.right = new Node(element);
            } else {
                this.right.insert(element);
            }
        }
    }
}

class Tree {
    Node root;

    public void insert(Integer element) {
        if(root == null) {
            root = new Node(element);
        } else {
            root.insert(element);
        }       
    }

    public void print() {
        Util.printInorder(root);
    }

    public ArrayList<Integer> sort() {
        ArrayList<Integer> al = new ArrayList<Integer>();
        Util.sort(al, root);
        return al;
    }
}

public class Test {

    public static void main(String[] args) {

        int [] array = new int[10];

        array[0] = ((int)(Math.random()*100+1));
        array[1] = ((int)(Math.random()*100+1));
        array[2] = ((int)(Math.random()*100+1));
        array[3] = ((int)(Math.random()*100+1));
        array[4] = ((int)(Math.random()*100+1));
        array[5] = ((int)(Math.random()*100+1));
        array[6] = ((int)(Math.random()*100+1));
        array[7] = ((int)(Math.random()*100+1));
        array[8] = ((int)(Math.random()*100+1));
        array[9] = ((int)(Math.random()*100+1));

        Tree tree = new Tree();

        for (int i = 0; i < array.length; i++) {
            tree.insert(array[i]);
        }

        tree.print();

        ArrayList<Integer> al = tree.sort();    

        System.out.println("sorted array : ");
        al.forEach(item -> System.out.print(item + " "));
}

}

ceyun
fuente