質問の降順ソートのプログラムをJavaで作ってみた。(2)

 前回の降順ソートプログラムに、いくつか加えて、100万個のランダムなデータをソートして速さを比較してみました。(^_^;
 やはり、シンプル・イズ・ベストってことかな。(^_^;

●ReverseSort2.java

/*
 * ReverseSort2.java
 */
 
import java.util.*;
class ReverseSort2 {
    static void reverseSort1(int[] a) { // 昇順ソートしてリバースする
        Arrays.sort(a);
        for(int i=0, j=a.length-1; i< j; i++, j--) {
            int t=a[i]; a[i]=a[j]; a[j]=t;
        }
    }
    
    static void reverseSort2(int[] a) { // ラッパー型に変換して降順ソートして戻す
        Integer[] b = new Integer[a.length];
        
        for(int i=0; i< a.length; i++) b[i]=a[i];   // オートボクシング
        Arrays.sort(b, Collections.reverseOrder());
        for(int i=0; i< a.length; i++) a[i]=b[i];   // オートアンボクシング
    }
    
    static void reverseSort3(Integer[] a) { // ラッパー型の降順ソート
        Arrays.sort(a, Collections.reverseOrder());
    }
    
    static void reverseSort4(Integer[] a) { // 比較関数をオーバーライドして降順ソート
        Arrays.sort(a, new Comparator<Integer>() {
            @Override
            public int compare(Integer lhs, Integer rhs) {
                if      (lhs < rhs) return  1;
                else if (lhs > rhs) return -1;
                return 0;
            }
        });
    }
    
    public static void main(String[] args) {
        final int N = 1000000;
        Random rand = new Random();
        int[]     values = new int[N];
        Integer[] Values = new Integer[N];
        long tm;        
        
        System.out.printf("データの個数:%,d [個]\n",N);
        
        System.out.println("//--- 昇順ソートしてリバースする ---//");
        for(int i=0; i< N; i++)
            values[i] = rand.nextInt(N);
        tm=System.nanoTime();       // Timer Start
        reverseSort1(values);
        tm=System.nanoTime()-tm;    // Timer Stop
        //System.out.println(Arrays.toString(values));
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
        
        System.out.println("//--- ラッパー型に変換して降順ソートして戻す ---//");
        for(int i=0; i< N; i++)
            values[i] = rand.nextInt(N);
        tm=System.nanoTime();       // Timer Start
        reverseSort2(values);
        tm=System.nanoTime()-tm;    // Timer Stop
        //System.out.println(Arrays.toString(values));
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
        
        System.out.println("//--- ラッパー型の降順ソート ---//");
        for(int i=0; i< N; i++)
            Values[i] = rand.nextInt(N);
        tm=System.nanoTime();       // Timer Start
        reverseSort3(Values);
        tm=System.nanoTime()-tm;    // Timer Stop
        //System.out.println(Arrays.toString(Values));
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
        
        System.out.println("//--- 比較関数をオーバーライドして降順ソート ---//");
        for(int i=0; i< N; i++)
            Values[i] = rand.nextInt(N);
        tm=System.nanoTime();       // Timer Start
        reverseSort4(Values);
        tm=System.nanoTime()-tm;    // Timer Stop
        //System.out.println(Arrays.toString(Values));
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

データの個数:1,000,000 [個]
//--- 昇順ソートしてリバースする ---//
Runtime : 0.195 [sec]
//--- ラッパー型に変換して降順ソートして戻す ---//
Runtime : 1.068 [sec]
//--- ラッパー型の降順ソート ---//
Runtime : 0.809 [sec]
//--- 比較関数をオーバーライドして降順ソート ---//
Runtime : 0.865 [sec]

※参考URL
[ Java ] Arrays クラスを使って配列を降順にソートする方法 - tekboy
Android(Java)でプリミティブ型の配列の降順ソートがめんどくさい

明解Java 入門編

明解Java 入門編

明解Javaによるアルゴリズムとデータ構造

明解Javaによるアルゴリズムとデータ構造

定本Javaプログラマのためのアルゴリズムとデータ構造

定本Javaプログラマのためのアルゴリズムとデータ構造