Ordina un array in Java


170

Sto cercando di creare un programma composto da un array di 10 numeri interi che hanno tutti un valore casuale, finora tutto bene.

Tuttavia, ora ho bisogno di ordinarli dal valore più basso a quello più alto e quindi stamparlo sullo schermo, come farei per farlo?

(Mi dispiace per avere così tanto codice per un programma così piccolo, non sono così bravo con i loop, ho appena iniziato a lavorare 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] );        

}

Risposte:


206

I loop sono anche molto utili per conoscere, specialmente quando si usano array,

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

199

Aggiungi la riga prima di println e l'array viene ordinato

Arrays.sort( array );

11
Potrei avere un esempio su come usarlo nel mio programma?
Lukas,

41

Può aiutarti a capire i cicli implementando te stesso. Vedere Bubble sort è facile da capire:

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

Naturalmente, non dovresti usarlo in produzione poiché esistono algoritmi con prestazioni migliori per elenchi di grandi dimensioni come QuickSort o MergeSort che sono implementati daArrays.sort(array)


BubbleSort è sicuramente un buon algoritmo per i principianti da imparare, ma come hai detto QuickSort o MergeSort hanno prestazioni molto migliori per set di dati più grandi e questi sono gli algoritmi utilizzati dal metodo Arrays.sort (array) per questo motivo. Grazie per averlo menzionato per chiunque non si sia reso conto.
h0r53,

Ho votato a favore di questa risposta poiché sarà più probabile che venga cercata dai principianti e i principianti dovrebbero sapere come implementare una funzione di ordinamento da soli.
Carrm,

Poiché la domanda iniziale riguarda l'ordinamento di un array di 10 numeri interi, l'ordinamento a bolle è totalmente accettabile. Produzione o no se non ci si aspetta di avere un input maggiore.
Andrew,


20

Ero pigro e ho aggiunto i cappi

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

L'array ha una lunghezza di 10. È necessaria una variabile ( i) che accetta i valori da 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 );

Metodi di libreria che ordinano le matrici.



7

Vedi sotto, ti darà ordinati sia in ordine crescente che decrescente

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

L'output sarà

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: è possibile utilizzare Math.ranodm invece di aggiungere numeri manuali. Fammi sapere se devo cambiare il codice ...

Buona fortuna ... Cin cin !!!


Non dovresti usare Integerquando puoi usare int, poiché ciò causerebbe lentezza.
JonasCz - Ripristina Monica il

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

6

Ecco come utilizzare questo nel tuo programma:

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

}

6

solo FYI, ora puoi usare la nuova API Java 8 per ordinare qualsiasi tipo di array usando parallelSort

parallelSort utilizza il framework Fork / Join introdotto in Java 7 per assegnare le attività di ordinamento a più thread disponibili nel pool di thread.

i due metodi che possono essere utilizzati per ordinare l' intarray,

parallelSort(int[] a)
parallelSort(int[] a,int fromIndex,int toIndex)

6

Per ordine naturale: Arrays.sort(array)

Per Ordine inverso: Arrays.sort(array, Collections.reverseOrder());-> È un metodo statico nella classe Collezioni che chiamerà ulteriormente una classe interna di se stesso per restituire un Comparatore inverso.


1
purtroppo la soluzione inversa non funziona per i primitivi. IntStream.range (0, size) .map (i -> array [size-i-1]). ToArray (); lo fa. size = array.length;
Andrei Konstantinov,

5

È possibile ordinare un array int con Arrays.sort( array ).


Potrei avere un esempio su come usarlo nel mio programma?
Lukas,

5

Java 8 offre la possibilità di utilizzare flussi che possono essere utilizzati per ordinare int[] arraycome:

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

Come menzionato nel documento per parallelSort:

L'algoritmo di ordinamento è un ordinamento parallelo che suddivide l'array in sotto-array che vengono a loro volta ordinati e quindi uniti. Quando la lunghezza della matrice secondaria raggiunge una granularità minima, la matrice secondaria viene ordinata utilizzando il metodo Arrays.sort appropriato. Se la lunghezza dell'array specificato è inferiore alla granularità minima, viene ordinata utilizzando il metodo Arrays.sort appropriato. L'algoritmo richiede uno spazio di lavoro non superiore alle dimensioni dell'array originale. Il pool comune ForkJoin viene utilizzato per eseguire qualsiasi attività parallela.

Quindi, se l'array di input è inferiore alla granularità (credo 8192 in Java 9 e 4096 in Java 8), allora parallelSortsemplicemente chiama l'algoritmo di ordinamento sequenziale.

Nel caso in cui desideriamo invertire l'ordine dell'array intero, possiamo utilizzare il comparatore come:

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

Poiché Java non ha modo di ordinare le primitive con un comparatore personalizzato, dobbiamo usare il boxing intermedio o qualche altra libreria di terze parti che implementa tale ordinamento primitivo.


Perché non usare un metodo semplice (da Java 1.2) come questo: Arrays.sort (myArray); ? Non è necessario Java Stream.
a_subscriber,

3

È possibile utilizzare la funzione Arrays.sort () .

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

0

IL MODO PIÙ EFFICACE!

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+" ");
}

1
Questo non funziona! Il primo ciclo sta solo mutando le variabili del ciclo (x) e gli elementi dell'array non vengono impostati. Quindi, finirai per ordinare una matrice di zeri.
rrufai,

0

Se vuoi creare tu stesso l'algoritmo di ordinamento rapido e avere una maggiore comprensione di come funziona, controlla il codice seguente:

1- Creare una classe di ordinamento

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- Invia la tua matrice non ordinata alla 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- Uscita

Unsorted array :[6, 5, 3, 1, 8, 7, 2, 4] 
Sorted array :[1, 2, 3, 4, 5, 6, 7, 8]

0

Possiamo anche usare l'albero di ricerca binario per ottenere un array ordinato usando il metodo di attraversamento in ordine. Il codice ha anche l'implementazione dell'albero di ricerca binaria di base di seguito.

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 + " "));
}

}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.