Javaのクイックソートバイト配列

現在のタスクでは、符号付き(符号なし)と符号なし(符号なし)の両方の大きなバイト配列をソートする必要がありました。 私の場合、配列のサイズは約10メガバイトでしたが、それほど多くはありません。つまり、メモリ内で並べ替えを使用できます。



最初はjava.util.Arrays.sort(byte [])を使い始めました...残念ながら、このソリューションは受け入れられないことが判明しました。

-Arrays.sortを使用すると、符号付きの値のみをソートできます... JDK開発者がこれに限定しているのは非常に奇妙です。

-Arrays.sortは汎用的な方法(高度なqsort)を使用しますが、現在のタスクなどの多くのタスクでは、これは最適ではありません。



結果として、私はいわゆるカウントによるソートに注目しました。これはこの場合最適です。 実装も非常にシンプルであることが判明しました。



ソート方法の説明:



1. int [256]の配列であるモデルを初期化します。 モデルの各i番目の要素はNi(元の配列の要素数がiに等しい)です。



2.モデルのi番目の要素ごとにNiを順番に書き込みながら、結果の配列を埋めます。



これで十分です。1回のパスで非常に迅速なソートが行われました。

さらに、このメソッドは符号付きソートと符号なしソートの両方で機能しますが、唯一の違いは、結果の配列の符号なしの充填では、0から255の範囲の要素と符号付きの要素--128から127の範囲の要素によって実行されることです。



クラスコードは次のとおりです(このコードの原理を理解するのに十分なスペースをとらないようにコメントを削除しました)。



public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  1. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  2. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  3. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  4. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  5. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  6. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  7. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  8. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  9. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  10. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  11. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  12. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  13. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  14. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  15. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  16. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  17. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  18. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  19. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  20. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  21. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  22. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  23. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  24. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  25. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  26. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  27. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  28. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  29. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  30. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



  31. public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .



public class ByteArraySorter { private static final int BYTE_MODEL_SIZE = 256; private static final int BYTE_MASK = 0xFF; private static final int BYTE_SIGNED_MIN_VALUE = -128; private static final int BYTE_SIGNED_MAX_VALUE = 127; private static final int BYTE_UNSIGNED_MIN_VALUE = 0; private static final int BYTE_UNSIGNED_MAX_VALUE = 255; public static void sort( byte [] buffer) { sort(buffer, BYTE_SIGNED_MIN_VALUE, BYTE_SIGNED_MAX_VALUE); } public static void sortUnsigned( byte [] buffer) { sort(buffer, BYTE_UNSIGNED_MIN_VALUE, BYTE_UNSIGNED_MAX_VALUE); } private static void sort( byte [] buffer, int fromValue, int toValue) { if (buffer == null ) { return ; } int length = buffer.length; if (length == 0) { return ; } int [] model = new int [BYTE_MODEL_SIZE]; for ( int i = 0; i < length; i++) { model[buffer[i] & BYTE_MASK]++; } int index = 0; for ( int i = fromValue; i <= toValue; i++) { int toIndex = index + model[i & BYTE_MASK]; while (index < toIndex) { buffer[index] = ( byte )i; index++; } } } } * This source code was highlighted with Source Code Highlighter .





10メガバイトの配列の測定結果:



Arrays.sort(バイト[]):

-ランダムな値で満たされた配列:0.703秒

-すでにソートされた値で満たされた配列:0.231秒

-ゼロのみで満たされた配列:0.060秒



ByteArraySort.sort(バイト[]):

-ランダムな値で満たされた配列:0.032秒

-ソート済みの値で埋められた配列:0. 032秒

-ゼロのみで埋められた配列:0.047秒



各テストは100回実行され、最小値が取られました(平均値は最小値とわずか数ミリ秒異なるため、この場合のエラーは無視できます)。



カウントによる並べ替えの利点は明確です。



注1.このタイプの並べ替えは、小さな配列に対して非効率的です。つまり、たとえば1000個未満の要素を並べ替える必要がある場合(値1000は実験的に取得されますが、時間と希望がある場合は、数学的に、より正確に計算できます)、他の並べ替えの種類。 配列に1000個を超える要素が含まれる場合、ソートのカウントには実質的に競合他社はありません。



注2.このアルゴリズムは、モデルに追加のメモリ、つまり256 * 4 = 1024バイトを使用します。 これはかなりですが、OutOfMemoryErrorを受け取る可能性がまだありますが、これを考慮することをお勧めします。



誰かがより良い選択肢を提供したり、改善できる点を述べたり、考えられる欠点を指摘したりした場合、私は非常に感謝します。



All Articles