1. ホーム
  2. java

[解決済み] Java : Arrays.sort()を使わずに整数配列をソートする。

2022-03-04 14:30:19

質問

これは、Javaの授業で行われる演習の1つである指示です。何よりも先に、私は「自分の宿題はする」し、Stack Overflowで誰かに答えを求めるような怠惰なことはしていない、ということを言いたいです。この特定の項目は、他のすべての演習の中で私の問題でした。なぜなら、私はこれに対する「完璧なアルゴリズム」を見つけるのに苦労していたからです。

<ブロッククオート

10個の整数値を入力し、昇順または降順で表示するJAVAプログラムを作成しなさい。注意:Arrays.sort()は使用できません。

これは私が考え出したコードで、動作はしますが、1つ明らかな欠点があります。例えば同じ値を2回以上入力した場合。

5, 5, 5, 4, 6, 7, 3, 2, 8, 10

入力された3つの5のうち1つだけがカウントされ、出力に含まれることになります。私が得た出力は(昇順の場合)です。

2 3 4 5 0 0 6 7 8 10.

import java.util.Scanner;

public class Exer3AscDesc
{
    public static void main(String args[])
    {
        Scanner scan = new Scanner(System.in);
        int tenNums[]=new int[10], orderedNums[]=new int[10];
        int greater;
        String choice;

        //get input
        System.out.println("Enter 10 integers : ");
        for (int i=0;i<tenNums.length;i++)
        {
            System.out.print(i+1+"=> ");
            tenNums[i] = scan.nextInt();
        }
        System.out.println();

        //imperfect number ordering algorithm
        for(int indexL=0;indexL<tenNums.length;indexL++)
        {
            greater=0;
            for(int indexR=0;indexR<tenNums.length;indexR++)
            {
                if(tenNums[indexL]>tenNums[indexR])
                {
                    greater++;
                }
            }
            orderedNums[greater]=tenNums[indexL];
        }

        //ask if ascending or descending
        System.out.print("Display order :\nA - Ascending\nD - Descending\nEnter your choice : ");
        choice = scan.next();

        //output the numbers based on choice
        if(choice.equalsIgnoreCase("a"))
        {
            for(greater=0;greater<orderedNums.length;greater++)
            {
                System.out.print(orderedNums[greater]+" ");
            }
        }
        else if(choice.equalsIgnoreCase("d"))
        {
            for(greater=9;greater>-1;greater--)
            {
                System.out.print(orderedNums[greater]+" ");
            }
        }
    }
}

解決方法は?

インターネットでは様々なソートアルゴリズムが紹介されていますが、もしあなた独自の解決法を見つけたいのであれば、あなたのコードに以下の変更を加えることができます。

の代わりに

 orderedNums[greater]=tenNums[indexL];

をする必要があります。

while (orderedNums[greater] == tenNums[indexL]) {
     greater++;
}
orderedNums[greater] = tenNums[indexL];

このコードは基本的に、特定のインデックスが同じような番号で占められているかどうかをチェックし、次に空いているインデックスを探そうとするものです。

注意:ソートされた配列の要素のデフォルト値は0なので、0がリストにないことを確認する必要があります。 という特別な番号でソートされた配列を開始します。 はリストにありません。 Integer.MAX_VALUE