Classificar uma matriz em Java

170

Eu estou tentando fazer um programa que consiste em uma matriz de 10 números inteiros que todos tem um valor aleatório, até agora tudo bem.

No entanto, agora eu preciso classificá-los na ordem do menor para o maior valor e depois imprimi-lo na tela, como eu faria isso?

(Desculpe por ter tanto código para um programa tão pequeno, eu não sou tão bom com loops, apenas comecei a trabalhar com 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
fonte
1
Java 8: stackoverflow.com/a/47811965/1216775
akhil_mittal

Respostas:

206

Loops também são muito úteis para aprender, especialmente Ao usar matrizes,

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
fonte
199

Adicione a linha antes de println e sua matriz será classificada

Arrays.sort( array );
Rauschen
fonte
11
Eu poderia obter um exemplo de como usá-lo no meu programa?
Lukas
41

Isso pode ajudá-lo a entender os loops ao se implementar. É fácil entender o tipo de bolha:

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;
            }
        }
    }
}

Obviamente, você não deve usá-lo na produção, pois existem algoritmos com melhor desempenho para grandes listas como QuickSort ou MergeSort, implementadas porArrays.sort(array)

isah
fonte
O BubbleSort é definitivamente um bom algoritmo para os iniciantes aprenderem, mas como você mencionou o QuickSort ou o MergeSort, o desempenho é muito melhor para conjuntos de dados maiores e esses são os algoritmos usados ​​pelo método Arrays.sort (array) por esse motivo. Obrigado por mencionar isso para qualquer pessoa que possa não ter percebido.
H0r53 11/1118
Eu votei acima nesta resposta, pois ela provavelmente será pesquisada por iniciantes e os iniciantes devem saber como implementar uma função de classificação sozinhos.
Carrm
Como a pergunta inicial é sobre a classificação de uma matriz de 10 números inteiros, a classificação por bolhas é totalmente aceitável. Produção ou não, se não houver expectativa de maior contribuição.
18719 Andrew
24

Dê uma olhada em Arrays.sort ()

uzilan
fonte
2
Eu poderia obter um exemplo de como usá-lo no meu programa?
Lukas
20

Eu estava com preguiça e adicionei os loops

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]);
        }
    }
}

Sua matriz possui um comprimento de 10. Você precisa de uma variável ( i) que leve os valores de 0para 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 );

É um método de biblioteca que classifica matrizes.

empilhador
fonte
17
Arrays.sort(yourArray)

fará o trabalho perfeitamente

Guillaume Slashy
fonte
7

Veja abaixo, ele fornecerá classificações ascendentes e descendentes

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();
}}

A saída 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: Você pode usar Math.ranodm em vez de adicionar números de manual. Deixe-me saber se preciso alterar o código ...

Boa sorte ... Saúde !!!

Fahim Parkar
fonte
Você não deve usar Integerquando puder usá-lo int, pois isso causará lentidão.
JonasCz - Restabelece Monica
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
fonte
6

Aqui está como usar isso em seu 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] );        

}
CloudyMarble
fonte
6

apenas para sua informação, agora você pode usar a nova API Java 8 para classificar qualquer tipo de matriz usando parallelSort

parallelSort usa a estrutura Fork / Join apresentada no Java 7 para atribuir as tarefas de classificação a vários threads disponíveis no pool de threads.

os dois métodos que podem ser usados ​​para classificar a intmatriz,

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

Para ordem natural: Arrays.sort(array)

Para ordem inversa: Arrays.sort(array, Collections.reverseOrder());-> É um método estático na classe Collections que chamará ainda mais uma classe interna para retornar um comparador reverso.

AalekhG
fonte
1
a solução invertida não funciona para primitivos, infelizmente. IntStream.range (0, tamanho) .map (i -> array [tamanho-i-1]). ToArray (); faz. tamanho = array.length;
Andrei Konstantinov
5

Você pode classificar uma matriz int com Arrays.sort( array ).

x4u
fonte
Eu poderia obter um exemplo de como usá-lo no meu programa?
Lukas
5

O Java 8 fornece a opção de usar fluxos que podem ser usados ​​para classificar int[] arraycomo:

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

Conforme mencionado no documento para parallelSort:

O algoritmo de classificação é uma mesclagem paralela que divide a matriz em sub-matrizes que são elas próprias classificadas e depois mescladas. Quando o comprimento da sub-matriz atinge uma granularidade mínima, a sub-matriz é classificada usando o método Arrays.sort apropriado. Se o comprimento da matriz especificada for menor que a granularidade mínima, ela será classificada usando o método Arrays.sort apropriado. O algoritmo requer um espaço de trabalho não superior ao tamanho da matriz original. O pool comum ForkJoin é usado para executar tarefas paralelas.

Portanto, se a matriz de entrada for menor que a granularidade (8192 elementos no Java 9 e 4096 no Java 8, acredito), parallelSortsimplesmente chame o algoritmo de classificação seqüencial.

Caso desejemos reverter a matriz inteira, podemos usar o comparador como:

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

Como o Java não tem como classificar primitivas com o comparador personalizado, precisamos usar o boxe intermediário ou alguma outra biblioteca de terceiros que implemente essa classificação primitiva.

akhil_mittal
fonte
Por que não usar um método simples (do Java 1.2) como este: Arrays.sort (myArray); ? Não precisa do Java Stream.
a_subscriber 29/09/19
3

Você pode usar a função Arrays.sort () .

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

MANEIRA MAIS 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
fonte
1
Isso não funciona! O primeiro loop está apenas modificando as variáveis ​​do loop (x) e os elementos do array não estão sendo definidos. Então, você acabará classificando uma matriz de zeros.
Rrufai
0

Se você deseja criar o algoritmo de classificação rápida e entender melhor como ele funciona, verifique o código abaixo:

1- Criar classe de classificação

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- Envie sua matriz não classificada para a Quicksortclasse

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- Saída

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

Também podemos usar a árvore de pesquisa binária para obter a matriz classificada usando o método transversal em ordem. O código também possui a implementação da árvore de pesquisa binária básica abaixo.

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
fonte