Сортировать массив в Java

170

Я пытаюсь сделать программу, которая состоит из массива из 10 целых чисел, все из которых имеют случайное значение, пока все хорошо.

Однако теперь мне нужно отсортировать их по порядку от минимального до максимального значения, а затем распечатать на экране, как мне поступить?

(Извините за то, что у меня так мало кода для программы, я не очень хорош с циклами, только начал работать с 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
источник
1
Java 8: stackoverflow.com/a/47811965/1216775
akhil_mittal

Ответы:

206

Циклы также очень полезны для изучения, особенно при использовании массивов,

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

Добавьте строку перед println, и ваш массив будет отсортирован

Arrays.sort( array );
Rauschen
источник
11
Могу ли я получить пример, как использовать его в моей программе?
Лукас
41

Это может помочь вам понять циклы, реализуя себя. Видеть Bubble сортировать легко:

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

Конечно, вы не должны использовать его в производстве, существует более эффективные алгоритмы для больших списков , таких как QuickSort или слияние , которые реализуются с помощьюArrays.sort(array)

ишах
источник
BubbleSort, безусловно, является хорошим алгоритмом для обучения новичков, но, как вы упомянули, QuickSort или MergeSort работают намного лучше для больших наборов данных, и именно эти алгоритмы используются методом Arrays.sort (array) по этой причине. Спасибо за упоминание этого для тех, кто, возможно, не понял.
h0r53
Я приветствую этот ответ, поскольку новички будут искать его с большей вероятностью, а новички должны знать, как реализовать функцию сортировки самостоятельно.
Каррм
Поскольку первоначальный вопрос касается сортировки массива из 10 целых чисел, пузырьковая сортировка полностью приемлема. Производство или нет, если нет ожидания, чтобы иметь больший вклад.
Андрей
24

Взгляните на Arrays.sort ()

uzilan
источник
2
Могу ли я получить пример, как использовать его в моей программе?
Лукас
20

Я был ленив и добавил петли

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

Ваш массив имеет длину 10. Вам нужна одна переменная ( i), которая принимает значения из 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 );

Это библиотека методов, которая сортирует массивы.

укладчик
источник
17
Arrays.sort(yourArray)

отлично выполнит работу

Гийом Слаши
источник
7

Смотрите ниже, это даст вам отсортированные по возрастанию и убыванию

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

Выход будет

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 

Примечание. Вы можете использовать Math.ranodm вместо добавления номеров вручную. Дайте мне знать, если мне нужно изменить код ...

Удачи ... Ура !!!

Фахим Паркар
источник
Вы не должны использовать, Integerкогда вы можете использовать int, так как это приведет к замедлению.
JonasCz - Восстановить Монику
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

Вот как использовать это в вашей программе:

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
источник
6

только к вашему сведению, теперь вы можете использовать новый API Java 8 для сортировки любого типа массива, используя parallelSort

parallelSort использует среду Fork / Join, представленную в Java 7, для назначения задач сортировки нескольким потокам, доступным в пуле потоков.

два метода, которые можно использовать для сортировки intмассива,

parallelSort(int[] a)
parallelSort(int[] a,int fromIndex,int toIndex)
Суфиян Гори
источник
6

Для естественного заказа: Arrays.sort(array)

Для обратного порядка: Arrays.sort(array, Collections.reverseOrder());-> Это статический метод в классе Collections, который будет дополнительно вызывать внутренний класс для возврата обратного компаратора.

AalekhG
источник
1
К сожалению, обратное решение не работает для примитивов. IntStream.range (0, size) .map (i -> array [size-i-1]). ToArray (); делает. size = array.length;
Андрей Константинов
5

Вы можете отсортировать массив int с помощью Arrays.sort( array ).

x4u
источник
Могу ли я получить пример, как использовать его в моей программе?
Лукас
5

Java 8 предоставляет возможность использования потоков, которые можно использовать для сортировки int[] arrayкак:

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

Как упомянуто в документе для parallelSort:

Алгоритм сортировки - это параллельная сортировка-слияние, которая разбивает массив на подмассивы, которые сами сортируются и затем объединяются. Когда длина под-массива достигает минимальной степени детализации, под-массив сортируется с использованием соответствующего метода Arrays.sort. Если длина указанного массива меньше минимальной гранулярности, он сортируется с использованием соответствующего метода Arrays.sort. Алгоритм требует рабочее пространство не больше, чем размер исходного массива. Общий пул ForkJoin используется для выполнения любых параллельных задач.

Поэтому, если входной массив меньше гранулярности (я полагаю, 8192 элемента в Java 9 и 4096 в Java 8), тогда parallelSortпросто вызывается алгоритм последовательной сортировки.

На всякий случай, если мы хотим выполнить обратную сортировку целочисленного массива, мы можем использовать компаратор как:

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

Поскольку у Java нет способа сортировки примитивов с помощью специального компаратора, мы должны использовать промежуточный бокс или какую-либо другую стороннюю библиотеку, которая реализует такую ​​примитивную сортировку.

akhil_mittal
источник
Почему бы не использовать простой метод (из Java 1.2), например, такой: Arrays.sort (myArray); ? Не нужен Java Stream.
a_subscriber
0

САМЫЙ ЭФФЕКТИВНЫЙ ПУТЬ!

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
Это не работает! Первый цикл изменяет только переменные цикла (x), а элементы массива не устанавливаются. Итак, вы закончите сортировку массива нулей.
rrufai
0

Если вы хотите самостоятельно построить алгоритм быстрой сортировки и лучше понять, как он работает, проверьте код ниже:

1- Создать класс сортировки

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- Отправьте свой несортированный массив в Quicksortкласс

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- Выход

Unsorted array :[6, 5, 3, 1, 8, 7, 2, 4] 
Sorted array :[1, 2, 3, 4, 5, 6, 7, 8]
Хоссам Хасан
источник
0

Мы также можем использовать двоичное дерево поиска для получения отсортированного массива, используя метод обхода по порядку. Код также имеет реализацию базового дерева двоичного поиска ниже.

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
источник