条件ステートメントを使用せずに配列を並べ替える

この記事がこの記事の代替バージョンになるとすぐに警告します。 はい、私はすぐに私を批判するために急ぐ方法をあなたに本当に伝えることができますが、みんな、ソリューションのプレゼンテーションアルゴリズムは最適ではありません。 コメントでは、Pythonでのさらに単純なアルゴリズムが提案されました。 Pythonでは、次のように書くだけで十分です。



array.sort()
      
      





そしてそれだけです。 どんな種類のアルゴリズムが必要なのか。 タスクでは、0〜100の制限が設定されましたが、私たちは怠け者ではありません。一般的な形式で、任意の値に対して、数字の繰り返しでそれを行います。 少し考えた後、私はこの決定に来ました:



コード
 public class main { public static int max(int a, int b) { int i; for (i = 0; i < a - Math.abs(b);) { return a; } return Math.abs(b); } public static void main(String[] args) { int[] arrayForSort; int[] sortArray; int NUM_ELEMENT = 20, maxNum = -1000, i, j; arrayForSort = new int[NUM_ELEMENT]; for (i = 0; i < NUM_ELEMENT; i++) { arrayForSort[i] = (int) (Math.random() * 101) - 50; maxNum = max(maxNum, arrayForSort[i]); System.out.print(arrayForSort[i] + " "); } System.out.println(); sortArray = new int[maxNum * 2 + 1]; for (i = 0; i < NUM_ELEMENT; i++) { sortArray[arrayForSort[i] + maxNum]++; } for (i = 0; i <= maxNum * 2; i++) { for (j = 0; j < sortArray[i]; j++) { System.out.print(i - maxNum + " "); } } } }
      
      







そして、ここで私が書いたことを見てみましょう。



一般に、比較を使用できないため、問題は最小値と最大値を見つけることです:



 public static int max(int a, int b) { int i; for (i = 0; i < a - Math.abs(b);) { return a; } return Math.abs(b); }
      
      





B moduloがAより大きい場合、サイクルは単に実行されず、元に戻ります。 これは非常に簡単なソリューションです。 「素晴らしい」数式なし。 シンプルで明確。 そしてもう1つ:なぜモジュロを取るのですか? これは、使用している並べ替え方法が原因です。



元の記事では、「フラグ付き」ソートが使用されています(正しく理解できた場合)。 最悪の場合O(N ^ 2)(またはそれに近い)でこのようなソートを実行しますが、これは良くありません。



この方法(名前は覚えていませんが、 王室の物を探すの怠lazではありません )は、数字が繰り返される場合でもO(N)を決定します。



 for (i = 0; i < NUM_ELEMENT; i++) { sortArray[arrayForSort[i] + maxNum]++; }
      
      





ソートの本質は、配列を埋めるときに、それ自体をソートすることです。 値をインデックスとして表し、このインデックス内の要素の数を増やします。



数値44を2回満たしました。これは、インデックス44のソートされた配列に2が含まれることを意味します。簡単です!



判明したように(どちらかが湾曲している)、配列は0からNまで作成され、-NからNまでは試行しなかったため、無駄になりました。 したがって、オフセットを行うため、モジュールの最大値を探しています。 次に、0を基準に単純に反映し、境界を除くすべての要素が正確に適合するインデックスの範囲を取得します。したがって、+ 1です。



解説
最小-48、最大38を取得します。したがって、アルゴリズムを簡素化するために、最小-48、最大48を使用します。 そして、最小値が0 -48 + 48になるようにシフトします



 sortArray = new int[maxNum * 2 + 1]; . . . sortArray[arrayForSort[i] + maxNum]++; . . . System.out.print(i - maxNum + " ");
      
      





それだけです。 プロセスを最適化し、この問題を解決するという彼のビジョンを提示しながら、タスクを完了しました。



出力例
35 -29 26 17 -44 -10 31 -22 24 2 -28 17 2 -36 -30 35 39 -35 41 50

-44 -36 -35 -30 -29 -28 -22-10 2 2 17 17 24 26 31 35 35 39 41 50




All Articles