Trier un tableau en Java

170

J'essaye de faire un programme qui se compose d'un tableau de 10 entiers qui ont tous une valeur aléatoire, jusqu'ici tout va bien.

Cependant, maintenant je dois les trier dans l'ordre de la valeur la plus basse à la valeur la plus élevée, puis l'imprimer à l'écran, comment pourrais-je procéder?

(Désolé d'avoir autant de code pour un programme aussi petit, je ne suis pas si bon avec les boucles, je viens de commencer à travailler avec 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
la source
1
Java 8: stackoverflow.com/a/47811965/1216775
akhil_mittal

Réponses:

206

Les boucles sont également très utiles à connaître, en particulier lors de l'utilisation de tableaux,

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
la source
199

Ajoutez la ligne avant println et votre tableau sera trié

Arrays.sort( array );
Rauschen
la source
11
Pourrais-je avoir un exemple comment l'utiliser dans mon programme?
Lukas
41

Cela peut vous aider à comprendre les boucles en vous implémentant vous-même. Voir le tri à bulles est facile à comprendre:

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

Bien sûr, vous ne devez pas l'utiliser en production car il existe des algorithmes plus performants pour les grandes listes telles que QuickSort ou MergeSort qui sont implémentés parArrays.sort(array)

isah
la source
BubbleSort est certainement un bon algorithme à apprendre pour les débutants, mais comme vous l'avez mentionné, QuickSort ou MergeSort fonctionnent beaucoup mieux pour des ensembles de données plus volumineux et ce sont les algorithmes utilisés par la méthode Arrays.sort (array) pour cette raison. Merci d'avoir mentionné cela pour quiconque ne s'en est pas rendu compte.
h0r53
Je vote pour cette réponse car elle sera plus probablement recherchée par les débutants et les débutants devraient savoir comment implémenter une fonction de tri par eux-mêmes.
Carrm
Puisque la question initiale concerne le tri d'un tableau de 10 entiers, le tri par bulles est tout à fait acceptable. Production ou pas si on ne s'attend pas à avoir un apport plus important.
Andrew
24

Jetez un œil à Arrays.sort ()

uzilan
la source
2
Pourrais-je avoir un exemple comment l'utiliser dans mon programme?
Lukas
20

J'étais paresseux et j'ai ajouté les boucles

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

Votre tableau a une longueur de 10. Vous avez besoin d'une variable ( i) qui prend les valeurs de 0à 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 );

Est une bibliothèque de méthodes qui trie les tableaux.

empileur
la source
17
Arrays.sort(yourArray)

fera parfaitement le travail

Guillaume Slashy
la source
7

Voir ci-dessous, il vous donnera un tri croissant et décroissant à la fois

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 sortie sera

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 

Remarque: vous pouvez utiliser Math.ranodm au lieu d'ajouter des nombres manuels. Faites-moi savoir si j'ai besoin de changer le code ...

Bonne chance ... à vous !!!

Fahim Parkar
la source
Vous ne devriez pas utiliser Integerlorsque vous pouvez utiliser int, car cela entraînerait de la lenteur.
JonasCz - Réintégrer Monica le
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
la source
6

Voici comment l'utiliser dans votre programme:

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

}
NuageuxMarbre
la source
6

juste pour info, vous pouvez maintenant utiliser la nouvelle API Java 8 pour trier tout type de tableau en utilisant parallelSort

parallelSort utilise le framework Fork / Join introduit dans Java 7 pour affecter les tâches de tri à plusieurs threads disponibles dans le pool de threads.

les deux méthodes qui peuvent être utilisées pour trier un inttableau,

parallelSort(int[] a)
parallelSort(int[] a,int fromIndex,int toIndex)
Soufiyan Ghori
la source
6

Pour l'ordre naturel: Arrays.sort(array)

Pour l'ordre inverse: Arrays.sort(array, Collections.reverseOrder());-> C'est une méthode statique dans la classe Collections qui appellera en outre une classe interne d'elle-même pour renvoyer un comparateur inversé.

AalekhG
la source
1
la solution inversée ne fonctionne pas pour les primitives, malheureusement. IntStream.range (0, taille) .map (i -> tableau [taille-i-1]). ToArray (); Est-ce que. taille = array.length;
Andrei Konstantinov
5

Vous pouvez trier un tableau int avec Arrays.sort( array ).

x4u
la source
Pourrais-je avoir un exemple comment l'utiliser dans mon programme?
Lukas
5

Java 8 offre la possibilité d'utiliser des flux qui peuvent être utilisés pour trier int[] arraycomme:

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

Comme mentionné dans doc pour parallelSort:

L'algorithme de tri est un tri-fusion parallèle qui divise le tableau en sous-tableaux qui sont eux-mêmes triés puis fusionnés. Lorsque la longueur du sous-tableau atteint une granularité minimale, le sous-tableau est trié à l'aide de la méthode Arrays.sort appropriée. Si la longueur du tableau spécifié est inférieure à la granularité minimale, elle est triée à l'aide de la méthode Arrays.sort appropriée. L'algorithme nécessite un espace de travail ne dépassant pas la taille du tableau d'origine. Le pool commun ForkJoin est utilisé pour exécuter toutes les tâches parallèles.

Donc, si le tableau d'entrée est inférieur à la granularité (8192 éléments en Java 9 et 4096 en Java 8 je crois), alors parallelSortappelle simplement l'algorithme de tri séquentiel.

Juste au cas où nous voudrions trier inversement le tableau d'entiers, nous pouvons utiliser le comparateur comme:

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

Puisque Java n'a aucun moyen de trier les primitives avec un comparateur personnalisé, nous devons utiliser la boxing intermédiaire ou une autre bibliothèque tierce qui implémente un tel tri primitif.

akhil_mittal
la source
Pourquoi ne pas utiliser une méthode simple (de Java 1.2) comme celle-ci: Arrays.sort (myArray); ? Pas besoin de Java Stream.
a_subscriber
3

Vous pouvez utiliser la fonction Arrays.sort () .

sort() method is a java.util.Arrays class method.          
Declaration : Arrays.sort(arrName)
éruptions cutanées
la source
0

LA MANIÈRE LA PLUS 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+" ");
}
max johnson
la source
1
Cela ne marche pas! La première boucle ne fait que muter les variables de boucle (x) et les éléments du tableau ne sont pas définis. Ainsi, vous finirez par trier un tableau de zéros.
rrufai
0

Si vous souhaitez créer vous-même l'algorithme de tri rapide et mieux comprendre son fonctionnement, vérifiez le code ci-dessous:

1- Créer une classe de tri

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- Envoyez votre tableau non trié en 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- Sortie

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

Nous pouvons également utiliser un arbre de recherche binaire pour obtenir un tableau trié en utilisant la méthode de traversée dans l'ordre. Le code a également l'implémentation de l'arbre de recherche binaire de base ci-dessous.

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
la source