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秒未満で偏微分方程式を解く

ブログ    

推薦する

信じられない! XiaoIceのデジタルツイン仮想人物は70日間ライブ放送されましたが、誰もそれが本物の人間ではないことに気づきませんでした

[[441368]]中国ビジネスニュースは70日間生放送されましたが、アンカーがデジタルツインの仮想...

...

...

会話型AIチャットボットの成功を測定する方法

[[385791]] 【51CTO.com クイック翻訳】組織は、特にヘルスケア分野において、データ...

...

AIを慎重に導入するためのベストプラクティス

人工知能を正しく使用するために、いくつかの提案があります。人工知能を実際に使用する際にこれらの提案を...

自動運転のジレンマと選択

ここ数年、自動運転車に対する熱狂が高まっています。これは確かに合理的です。自動運転車は、燃費の向上、...

Googleが独自のAIチップを開発することを選択した6つの理由

[51CTO.com クイック翻訳] 長い間、Google などのクラウドベンダーは、自社のデータセ...

人工知能について - AIに関するあまり知られていない事実

人工知能(AI)は60年前の1956年の夏に誕生しました。今日の科学技術の発展により、人工知能は人間...

...

優れたプレーンテキストモデル? GPT-4は準備完了

2020年5月、GPT-3はGPT-2のリリースから1年後に正式にリリースされました。GPT-2も...

ソフトウェアがハードウェアを飲み込むAI時代において、チップがアルゴリズムの進化に追いつけない場合、私たちはどうすればよいのでしょうか?

AI時代の陰の立役者として、チップ業界は徐々にかつ継続的な変化を遂げています。 2008 年以降、...

フェイフェイ・リーのチームはディープラーニングの「遊び場」を作った。AIも独自に進化しており、考えてみると恐ろしいことだ。

[[427578]]動物の知能は、環境と相互作用するにつれて、その体の形に合わせて進化します。例え...

...