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

ブログ    
ブログ    
ブログ    

推薦する

Zhihu の Bridge Platform は、ビジネス機能を強化するコンテンツ運用プラットフォームをどのように構築するのでしょうか?

1. キーワードZhihu、Bridge、コンテンツ プール、コンテンツ管理プラットフォーム、コン...

自分の写真がディープフェイクに使われるのではないかと心配ですか?ボストン大学の新しい研究を試してみてください

顔を入れ替えた動画は、DL を悪用した大きな結果です。インターネット上にあなたの写真がある限り、あな...

アルゴリズム、データ、機械学習機能... AI スタートアップの堀とは何でしょうか?

[[207684]]投資家が最も注目する点の一つは、起業家が独自の堀を見つけているかどうかだ。そし...

自動運転のフードデリバリーが利用可能に、Meituanがすぐにあらゆるものを配達

北京、首鋼冬季オリンピック公園。最近、「MAI Shop」という小売店がここにオープンし、すぐにネッ...

スタンフォード大学のエビ揚げロボットがネットで話題に!中国チームの費用は22万元で、フルコースの食事の調理や食器洗いもできる。

現在、大皿料理を調理できるスタンフォード大学のロボット「Mobile ALOHA」がインターネット上...

...

人工知能技術とアプリケーションを徹底的に分析し、人工知能産業チェーンを効果的に理解します。

近年、モノのインターネット、ビッグデータ、人工知能などのホットなテクノロジーワードが毎日テクノロジー...

ImageNetに匹敵するこのデータセットは、MITによって腹立たしい理由で緊急に削除されました。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

人工知能を背景にした教育の未来を探る

教育の分野では、人工知能の倫理に関する人々の考え方には複数の道が存在します。例えば、主観に基づく検討...

ロボットが製造業にもたらした変化は実に目覚ましいものがあります。

知能ロボットの誕生は、国内の多くの産業に新たな力をもたらしました。ロボットの導入により、サービス業は...

ロボティック・プロセス・オートメーション(RPA)がCIOにとって優先課題である理由

自動化技術は企業ビジネスの発展を促進しており、ロボティック・プロセス・オートメーション (RPA) ...

...

...

...