Java プログラミング スキル - データ構造とアルゴリズム「基数ソート」

Java プログラミング スキル - データ構造とアルゴリズム「基数ソート」

[[394975]]

基数ソート

  1. 基数ソートは「分散ソート」に属し、「バケット ソート」または「ビン ソート」とも呼ばれます。想像どおり、ソートする要素をキー値の各ビットの値に応じて特定のバケットに分散してソート効果を実現します。
  2. 基数ソートは安定性ソートに属し、基数ソートは効率的な安定性ソート方法です。
  3. 基数ソートはバケットソートの拡張です。
  4. 基数ソートは 1887 年にヘルマン・ホレリスによって発明されました。実装方法は、整数を桁数に応じて異なる数値に分割し、各桁を個別に比較します。

ソートの基本的な考え方

比較するすべての値は同じ桁の長さになるようにし、短い数値には先頭にゼロを埋め込みます。次に、最下位ビットから始めて、1 つずつ並べ替えます。このように、最下位ビットから最上位ビットまでソートすると、シーケンスは順序付けられたシーケンスになります。

コード例

  1. パッケージ com.xie.sort;
  2.  
  3. パブリッククラスRadixSort {
  4. 公共 静的void main(String[] args) {
  5. int [] arr = 新しいint [8000000];
  6. ( int i = 0; i < 8000000; i++) {
  7. arr[i] = ( int )(Math.random()*800000000);
  8. }
  9. 長い開始 = System.currentTimeMillis();
  10. 基数ソート(arr);
  11. 長い終了= System.currentTimeMillis();
  12. System.out.println ( "所要時間:" +( end -start)+ "ms" );
  13. /*
  14. 800万データ、時間消費: 939ミリ秒
  15. */
  16. }
  17.  
  18. // 基数ソート
  19. 公共 静的void radixSort( int [] arr) {
  20.  
  21. 整数 最大値= arr[0];
  22. ( int i = 1; i < arr.length; i++) {
  23. もし(arr[i] >最大値){
  24. 最大値= arr[i];
  25. }
  26. }
  27. //配列内の最長桁数
  28. int最大長さ = (最大+ "" ).length();
  29.  
  30. //ラウンド1(各要素の単位をソート)
  31. // 10 個のバケットを表す 2 次元配列を定義します。各バケットは 1 次元配列です。
  32. //1. 2次元配列には10個の1次元配列が含まれる
  33. //2. 数値を入れるときにデータがオーバーフローするのを防ぐために、各1次元配列(バケット)のサイズはarr.lengthに設定されます。
  34. //3. 基数ソートは、空間を時間の代わりに使う古典的なアルゴリズムである
  35. int [][] バケット = 新しいint [10][arr.length];
  36.  
  37. //各バケットに実際に保存されているデータの量を記録するため、各バケットに毎回入れられるデータの数を記録する 1 次元配列を定義します。
  38. //bucketElementCounts[0]はbucket[0]に格納されたデータの数を記録します。
  39. int [] バケット要素カウント = 新しいint [10];
  40.  
  41. // バケットの順序に従って(1次元配列の添え字を順に取り出して元の配列に入れる)
  42. 整数 インデックス= 0;
  43. ( int i = 0, n = 10; i < maxLength; i++, n *= 10) {
  44. ( int j = 0; j < arr.length; j++)の場合{
  45. //桁数を取得する
  46. int digitOfElement = arr[j] / n % 10;
  47. //対応するバケットを
  48. バケット[要素の桁数][バケット要素数[要素の桁数]] = arr[j];
  49. バケット要素数[要素の桁数]++;
  50. }
  51.  
  52. インデックス= 0;
  53. //各バケットを走査し、バケット内のデータを元の配列に格納します
  54. ( int k = 0; k < bucketElementCounts.length; k++) {
  55. //バケットにデータがある場合は、元の配列に格納します
  56. バケット要素数[k]が0の場合
  57. //k 番目のバケット (つまり、k 番目の 1 次元配列) をループ バケットに格納します。
  58. ( int l = 0; l < バケット要素カウント[k]; l++) {
  59. // 要素を取り出して arr に格納します
  60. arr[インデックス] = バケット[k][l];
  61. インデックス++;
  62. }
  63. }
  64. バケット要素数[k] = 0;
  65. }
  66. }
  67. }
  68. }

基数ソートの手順

  1. 基数ソートではスペースと時間をトレードオフするため、大量のデータをソートするときに OutOfMemoryError が発生しやすくなります。
  2. 基数ソートは安定しています。 [注: ソートするレコード シーケンスに同じキーワードを持つレコードが複数あると仮定します。ソート後もこれらのレコードの相対順序が変わらない場合、つまり元のシーケンスで r[i]=r[j] であり、r[i] が r[j] の前にあり、ソートされたシーケンスでも r[i] が依然として r[j] の前にある場合、このアルゴリズムは安定していると呼ばれ、そうでない場合は不安定です。]
  3. 負の数を含む配列の基数ソートについては、https://code.i-harness.com/zh-CN/q/e98fa9 を参照してください。

<<:  組織のサイバーセキュリティ向上における人工知能の役割

>>:  高度な数学に希望があります!ニューラルネットワークは1秒未満で偏微分方程式を解く

ブログ    
ブログ    

推薦する

ナレッジグラフは人気があります。今すぐ選んでみませんか。

[51CTO.comより引用] モバイルインターネットの発展に伴い、あらゆるものの相互接続が可能に...

...

人工知能の発達により、親は子供たちに新しいエリートの考え方を教えざるを得なくなった

人工知能は急速に発展しており、その理論と技術はますます成熟し、その応用分野は絶えず拡大しています。人...

...

X-Dreamerは2Dと3D生成のギャップを埋め、高品質のテキストから3D生成を実現します。

近年、事前学習済みの拡散モデル[1, 2, 3]の開発により、テキストから3Dコンテンツへの自動作成...

...

...

シンプルで効率的なアルゴリズムが衛星IoTを現実に近づける

背景モノのインターネット (IoT) の継続的な発展は、ここ数年にわたって現実のものとなってきました...

外国人の機械学習エンジニアは失業に直面しているのに、なぜ彼らはまだMLの学習にこだわるのでしょうか?

機械学習の分野では悲観的な見通しが広がっています。機械学習の人材の採用は減速しています。 [[334...

トークンとメモリを理解することによってのみ、ChatGPT をよりよくマスターできます。

著者: ラセル・コーン編纂者:ヤン・ジェンChatGPT のような大規模言語モデル (LLM) は ...

AI戦争が近づく中、ChatGPTが軍事禁止を解除

先週末、大手人工知能企業OpenAIは、ChatGPTの使用ポリシーから軍事利用を禁止する条項をひっ...

...

KDnuggets 公式調査: データ サイエンティストが最もよく使用する 10 のアルゴリズム

[[174162]]最新の KDnuggets 調査では、データ サイエンティストが最もよく使用する...