在Java中对数组进行排序

Posted

技术标签:

【中文标题】在Java中对数组进行排序【英文标题】:Sort an array in Java 【发布时间】:2012-02-14 19:56:46 【问题描述】:

我正在尝试制作一个包含 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] );        


【问题讨论】:

【参考方案1】:

在打印数组之前只需执行以下操作:-

Arrays.sort(array);

注意:- 您必须通过以下方式导入数组类:-

import java.util.Arrays;

【讨论】:

【参考方案2】:

请注意 Arrays.sort() 方法不是线程安全的:如果您的数组是单例的属性,并且在多线程环境中使用,则应将排序代码放入同步块,或创建数组的副本并对该副本进行排序(仅复制数组结构,使用内部相同的对象)。

例如:

 int[] array = new int[10];
 ...
 int[] arrayCopy = Arrays.copyOf(array , array .length);
 Arrays.sort(arrayCopy);
 // use the arrayCopy;
 

【讨论】:

【参考方案3】:

我们也可以使用二叉搜索树通过中序遍历的方法来获取排序的数组。该代码还具有以下基本二叉搜索树的实现。

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

【讨论】:

【参考方案4】:

如果您想自己构建快速排序算法并对其工作原理有更多了解,请查看以下代码:

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]

【讨论】:

【参考方案5】:

对于自然顺序:Arrays.sort(array)

逆序:Arrays.sort(array, Collections.reverseOrder()); --> Collections 类中的静态方法,会进一步调用自身的内部类返回一个逆向比较器。

【讨论】:

不幸的是,逆向解决方案不适用于基元。 IntStream.range(0, size).map(i -> array[size-i-1]).toArray();做。 size = array.length;【参考方案6】:

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 公共池用于执行任何并行任务。

因此,如果输入数组小于粒度(我相信 Java 9 中有 8192 个元素,Java 8 中有 4096 个元素),那么 parallelSort 只需调用顺序排序算法。

如果我们想对整数数组进行反向排序,我们可以使用比较器:

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

由于 Java 无法使用自定义比较器对基元进行排序,因此我们必须使用中间装箱或其他一些第三方库来实现这种基元排序。

【讨论】:

为什么不使用这样的简单方法(来自 Java 1.2):Arrays.sort(myArray); ?不需要Java Stream。【参考方案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;
        
    

【讨论】:

【参考方案8】:

它可以帮助您通过实现自己来理解循环。看冒泡排序很容易理解:

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;
            
        
    

当然,您不应该在生产环境中使用它,因为对于大型列表,诸如 QuickSortMergeSort 等性能更好的算法由 Arrays.sort(array) 实现p>

【讨论】:

BubbleSort 绝对是初学者学习的好算法,但正如您提到的,QuickSort 或 MergeSort 对于较大的数据集表现得更好,这些是 Arrays.sort(array) 方法使用的算法,因此。感谢您为可能没有意识到的任何人提及这一点。 我赞成这个答案,因为初学者更有可能搜索它,初学者应该知道如何自己实现排序功能。 因为最初的问题是关于对 10 个整数的数组进行排序,所以冒泡排序是完全可以接受的。如果不期望有更大的投入,是否生产。【参考方案9】:

您可以使用Arrays.sort() 函数。

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

【讨论】:

【参考方案10】:
Arrays.sort(yourArray)

会完美地完成这项工作

【讨论】:

【参考方案11】:

最有效的方法!

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

【讨论】:

这行不通!第一个循环只是改变循环变量(x)并且数组元素没有被设置。所以,你最终会对一个零数组进行排序。【参考方案12】:

仅供参考,您现在可以使用 Java 8 新 API 使用 parallelSort 对任何类型的数组进行排序

parallelSort 使用 Java 7 中引入的 Fork/Join 框架将排序任务分配给线程池中可用的多个线程。

可用于int数组排序的两种方法,

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

【讨论】:

【参考方案13】:

循环也是非常有用的学习,尤其是在使用数组时,

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

【讨论】:

【参考方案14】:

见下文,它将为您提供升序和降序排序

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 而不是手动添加数字。如果我需要更改代码,请告诉我...

祝你好运...干杯!!!

【讨论】:

当你可以使用int时,你不应该使用Integer,因为这样做会导致速度变慢。【参考方案15】:

我很懒,添加了循环

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),它的值从 09

for ( int i = 0  ; i < array.length ;   i++ ) 
       ^               ^                   ^
       |               |                   ------  increment ( i = i + 1 )
       |               |
       |               +-------------------------- repeat as long i < 10
       +------------------------------------------ start value of i


Arrays.sort( array );

是一个对数组进行排序的库方法。

【讨论】:

【参考方案16】:

下面是如何在你的程序中使用它:

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


【讨论】:

【参考方案17】:

在 println 之前添加行,你的数组就会被排序

Arrays.sort( array );

【讨论】:

我可以举个例子如何在我的程序中使用它吗?【参考方案18】:

您可以使用 Arrays.sort( array ) 对 int 数组进行排序。

【讨论】:

我可以举个例子如何在我的程序中使用它吗?【参考方案19】:

看看Arrays.sort()

【讨论】:

我可以举个例子如何在我的程序中使用它吗?

以上是关于在Java中对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在Java中对二维字符串数组进行排序

在 java 中对 ArrayList<Integer> 的数组进行排序

java 在java中对一个长度为int的数组进行排序

如何在 ColdFusion 中对结构数组进行排序

如何使用一些静态值在javascript中对数组进行排序?

如何在 Bash 中对数组进行排序