Сортування масиву в 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] );        

}

Відповіді:


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

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 або MergeSort, які реалізуютьсяArrays.sort(array)


BubbleSort - це, безумовно, хороший алгоритм для початківців для навчання, але, як ви згадали, QuickSort або MergeSort працюють набагато краще для великих наборів даних, і це алгоритми, використовувані з цієї причини методом Arrays.sort (масив). Дякуємо, що згадали про це для всіх, хто, можливо, не усвідомив.
h0r53

Я підтримую цю відповідь, оскільки її швидше шукатимуть початківці, і початківці повинні знати, як реалізувати функцію сортування самостійно.
Карм

Оскільки початкове питання стосується сортування масиву з 10 цілих чисел, сортування бульбашок цілком прийнятно. Виробництво чи ні, якщо не очікується більшого вкладу.
Андрій


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

Це бібліотечні методи, які сортують масиви.



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

}

6

просто FYI, тепер ви можете використовувати новий Java API 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, який надалі викликатиме внутрішній клас для повернення зворотного компаратора.


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

5

Ви можете сортувати масив int Arrays.sort( array ).


Чи можу я отримати приклад, як його використовувати у своїй програмі?
Лукас

5

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

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

Як зазначено в doc для 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 немає можливості сортувати примітиви за допомогою спеціального компаратора, нам доводиться використовувати проміжний бокс або іншу сторонній бібліотеку, яка реалізує таке примітивне сортування.


Чому б не скористатися простим методом (з 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 + " "));
}

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.