Java でよく使われる 7 つのソート アルゴリズムの概要

Java でよく使われる 7 つのソート アルゴリズムの概要

しばらく時間が空いたので、Java でよく使われる 7 つのソート アルゴリズムをまとめてみました。後でまた見返せるといいのですが。

1. 挿入ソートアルゴリズム

挿入ソートの基本的な考え方は、配列をトラバースする過程で、シリアル番号 i の前の要素、つまり [0..i-1] がソートされていると想定することです。このトリップでは、i に対応する要素 x の正しい位置 k を見つける必要があり、この位置 k を見つける過程で、比較する要素を 1 つずつ 1 つずつ後ろに移動して要素 x のための「スペースを確保」し、最後に k に対応する要素値を x に割り当てます。一般に、挿入ソートの時間計算量と空間計算量は、それぞれ O(n2) と O(1) です。

  1. /**
  2. * @param int[] ソートされていない配列
  3. * @return int[] ソートされた配列
  4. */  
  5.  
  6. 公共  int [] sortInsert( int [] 配列){
  7. ( int i = 1 ;i < array.length;i++){
  8. int temp = 配列[i];
  9. 整数j;
  10. ( j=i- 1 ;j >= 0 && temp< 配列[j]; j--){
  11. 配列[j + 1 ] = 配列[j];
  12. }
  13. 配列[j + 1 ] = temp;
  14. }
  15. 配列を返します
  16. }

2. 選択ソートアルゴリズム

選択ソートの基本的な考え方は、配列をトラバースすることです。i はソートする必要がある現在のシーケンス番号を表します。残りの [i...n-1] で最小値を見つけ、見つかった最小値を i が指す値と交換する必要があります。要素を決定するたびに、最適な値を選択するサブプロセスがあるため、比喩的に選択ソートと呼ばれます。選択ソートの時間計算量と空間計算量はそれぞれO(n2)とO(1)です。

  1. /**
  2. * @param int[] ソートされていない配列
  3. * @return int[] ソートされた配列
  4. */  
  5.  
  6. 公共  int [] ソート選択( int [] arr){
  7. ( int i = 0 ; i < arr.length; i++) {
  8. int miniPost = i;
  9. ( int m = i + 1 ; m < arr.length; m++) {
  10. (arr[m] < arr[miniPost])の場合{
  11. ミニポスト = m;
  12. }
  13. }
  14.  
  15. (arr[i] > arr[miniPost])の場合{
  16. 整数温度;
  17. temp = arr[i];
  18. arr[i] = arr[miniPost];
  19. arr[miniPost] = temp;
  20. }
  21. }
  22. arrを返します
  23. }

3. バブルソートアルゴリズム

バブルソートは、大きい数字を下に、小さい数字を上に並べるソートです。

  1. /**
  2. * @param int[] ソートされていない配列
  3. * @return int[] ソートされた配列
  4. */  
  5.  
  6. 公共  int [] ソートバブル( int [] 配列){
  7. 整数温度;
  8. // 第 1 レベルのループ: 比較回数を示します。たとえば、長さの要素がある場合、比較回数は長さ - 1 になります (それ自体と比較する必要はありません)  
  9. ( int i = 0 ; i < 配列の長さ- 1 ; i++) {
  10. ( int j = array.length - 1 ; j > i; j--) {
  11. (配列[j] < 配列[j - 1 ])の場合{
  12. temp = 配列[j];
  13. 配列[j] = 配列[j - 1 ];
  14. 配列[j - 1 ] = temp;
  15. }
  16. }
  17. }
  18. 配列を返します
  19. }

4. クイックソートアルゴリズム

並べ替えのプロセスを通じて、レコードの1つの部分のキーワードが2つの独立した部分に分かれています。ベースが小さい場合は、ベースが右側の位置(一時的な高い位置として記録)に移動します。ベースの左側は、上記の2つのステップを低く繰り返します。

  1. /**
  2. * @param int[] ソートされていない配列
  3. * @return int[] ソートされた配列
  4. */  
  5.  
  6. 公共  int [] sortQuick( int [] 配列){
  7. quickSort(配列、 0 、配列の長さ - 1 )を返します
  8. }
  9.  
  10. プライベート  int [] クイックソート( int [] arr, int下限, int上限) {
  11. (低さ < 高さ)の場合{
  12. int除算 = パーティション (arr、low、high);
  13. クイックソート(arr, low, division - 1 );
  14. クイックソート(arr, 分割 + 1 , 高さ);
  15. }
  16. arrを返します
  17. }
  18.  
  19. // 流域、ベース、左側のものはこの位置より小さく、右側のものは大きい 
  20. プライベート  intパーティション ( int [] arr, int低, int高) {
  21. int base = arr[low]; //サブテーブルの最初のレコードをピボット(ウォーターシェッド)レコードとして使用します 
  22. while (low < heigh) { //テーブルの両端から中央まで交互にスキャンする 
  23. (low < heigh && arr[heigh] >= base)の場合{
  24. 高さ--;
  25. }
  26. // ベースは現在の高さ位置に割り当てられ、ここでベースは移動(スワップ)され、高さ位置の右側はベースよりも大きくなります 
  27. swap(arr,heigh,low);
  28. (low < height && arr[low] <= base)の場合{
  29. 低++;
  30. }
  31. // 左の値が基本値より大きい場合は位置を変更します 
  32. swap(arr,heigh,low);
  33. }
  34. // 現在 low = high;  
  35. 低く戻る;
  36. }
  37.  
  38. プライベート  void swap( int [] arr, int a, int b) {
  39. 整数温度;
  40. temp = arr[a];
  41. arr[a] = arr[b];
  42. arr[b] = 一時;
  43. }

5. マージソートアルゴリズム

マージソートは再帰的に実装され、「分割統治」方式に属します。ターゲット配列は中央から 2 つに分割され、2 つの配列は別々にソートされます。ソートが完了すると、ソートされた 2 つの配列が「マージ」されます。マージソートで最も重要なことは、「マージ」プロセスです。マージプロセスには、マージする 2 つの配列と同じ長さの追加スペースが必要です。

  1. /**
  2. * @param int[] ソートされていない配列
  3. * @return int[] ソートされた配列
  4. */  
  5. プライベート  int [] ソート( int [] 数値, int下限, int上限) {
  6. int中間 = (低 + 高) / 2 ;
  7. (低<高)の場合{
  8. // 左 
  9. 並べ替え(数値、低、中);
  10. // 右 
  11. 並べ替え(数値、中央 + 1 、高);
  12. // 左と右をマージ 
  13. マージ(数値、低、中、高);
  14. }
  15. 数値を返します
  16. }
  17.  
  18. プライベート  void merge( int [] nums, int low, int mid, int high) {
  19. int [] temp =新しい  int [高 - 低 + 1 ];
  20. int i = low; // 左ポインタ 
  21. int j = mid + 1 ; // 右ポインタ 
  22. 整数k = 0 ;
  23. // 小さい数字をまず新しい配列に移動します 
  24. ( i <= 中間 && j <= 高) {
  25. (数値[i] < 数値[j])の場合{
  26. temp[k++] = nums[i++];
  27. }それ以外{
  28. temp[k++] = nums[j++];
  29. }
  30. }
  31. // 残りの数字を左側の配列に移動する 
  32. (i <= 中間) {
  33. temp[k++] = nums[i++];
  34. }
  35. // 残りの数字を右側の配列に移動する 
  36. (j <= 高さ)の間{
  37. temp[k++] = nums[j++];
  38. }
  39. // nums配列を新しい配列の数字で上書きします 
  40. ( int k2 = 0 ; k2 < temp.length; k2++) {
  41. nums[k2 + 下限] = temp[k2];
  42. }
  43. }
  44.  
  45. 公共  int [] sortMerge( int [] 配列) {
  46. sort(配列、 0 、配列の長さ - 1 )を返します
  47. }

6. シェルソートアルゴリズム

シェル ソートが誕生したのは、挿入ソートでは大きな配列を処理するときに移動しなければならない要素が多すぎるという問題に遭遇したためです。ヒルソートの考え方は、大きな配列をギャップで分割されたいくつかの小さな配列に「分割して征服する」ことです。たとえば、配列[1、2、3、4、5、6、7、8]は、ギャップ= 2で分割すると、[1、3、5、7]と[2、4、6、8]の2つの配列に分割できます(同様に、ギャップ= 3の場合、分割された配列は[1、4、7]、[2、5、8]、[3、6]です)。次に、分割された配列に対してそれぞれ挿入ソートを実行します。各サブ配列がソートされた後、ギャップ値が減らされ、ギャップ= 1になるまで、つまり配列全体が挿入されてソートされるまで、前の手順が繰り返されます。この時点で、配列は基本的にソートされているため、移動する必要がある要素は非常に小さくなり、挿入ソートが大きな配列を処理するときに移動回数が多いという問題が解決されます。

シェルソートは挿入ソートの改良版です。データ量が多い場合の効率向上に非常に役立ちます。データ量が少ない場合は、挿入ソートを直接使用することをお勧めします。

  1. /**
  2. * @param int[] ソートされていない配列
  3. * @return int[] ソートされた配列
  4. */  
  5.  
  6. 公共  int [] sortShell( int [] 配列) {
  7. // 増分を取得する 
  8. intステップ = 配列の長さ / 2 ;
  9. (ステップ >= 1 )の間{
  10. for ( int i = step; i < array.length; i++) {
  11. int temp = 配列[i];
  12. 整数j = 0 ;
  13. // 挿入ソートとの違いはここ 
  14. ( j = i - ステップ; j >= 0 && temp < 配列[j]; j -= ステップ) {
  15. 配列[j + ステップ] = 配列[j];
  16. }
  17. 配列[j + ステップ] = temp;
  18. }
  19. ステップ /= 2 ;
  20. }
  21. 配列を返します
  22. }

7. ヒープソートアルゴリズム

要点は、まずビッグ トップ ヒープを作成し、親が子よりも大きく、ルート ノードが *** ノードであり、*** ノード (ルート) を末尾ノード (より小さい *** ノード) と交換して、*** 末尾ノードを *** に残し、残りは *** 要素から末尾ノードの前の位置まで、ビッグ トップ ヒープを再帰的に構築することです。

  1. /**
  2. * @param int[] ソートされていない配列
  3. * @return int[] ソートされた配列
  4. */  
  5. 公共  int [] sortHeap( int [] 配列) {
  6. buildHeap(array); // ヒープを構築 
  7. int n = 配列の長さ;
  8. 整数i = 0 ;
  9. (i = n - 1 ; i >= 1 ; i--)の場合{
  10. swap(配列, 0 , i);
  11. ヒープ化(配列、 0 、i);
  12. }
  13.  
  14. 配列を返します
  15. }
  16.  
  17. プライベート  void buildHeap( int [] 配列) {
  18. int n = array.length; // 配列内の要素数 
  19. ( int i = n / 2 - 1 ; i >= 0 ; i--)の場合
  20. ヒープ化(配列、i、n);
  21. }
  22.  
  23. プライベート  voidヒープ化( int [] A, int idx, int max) {
  24. int left = 2 * idx + 1 ; // 左の子のインデックス(存在する場合)  
  25. int right = 2 * idx + 2 ; // 左の子のインデックス(存在する場合)  
  26. int largest = 0 ; // 3つのノードの中で最大の値を持つノードのインデックスを見つける 
  27. (左 < 最大値 && A[左] > A[idx])の場合
  28. 最大 = 左;
  29. それ以外 
  30. 最大 = idx;
  31. if (right < max && A[right] > A[largest])
  32. 最大 = 右;
  33. (最大 != idx)の場合{
  34. swap(A, 最大, idx);
  35. ヒープ化(A, 最大, 最大);
  36. }
  37. }
  38. }
  39. // [s, m] に s のみが存在すると仮定してヒープ関数を作成する 
  40. // 対応するキーワードはビッグヒープ定義を満たしていません。調整して [s, m] をビッグヒープにします ==============================================================  
  41. 公共 静的  void heapAdjust( int [] 配列, int s, int m) {
  42. // 0 の添え字要素を一時記憶単位として使用します 
  43. 配列[ 0 ] = 配列[s];
  44. // 大きな子ノードに沿ってフィルタリングする 
  45. ( int j = 2 * s; j <= m; j *= 2 )の場合{
  46. // j がより大きな子ノードの添え字であること、j < m であること、j+1 <= m であること、境界を越えないことを保証 
  47. (j < m && 配列[j] < 配列[j + 1 ])の場合{
  48. j++;
  49. }
  50. 配列[ 0 ] < 配列[j]) の場合
  51. 壊す;
  52. }
  53. // S が小さい場合は、大きい方の子を上に移動する必要があります 
  54. 配列[s] = 配列[j];
  55. // 大きい子の値は S 位置の小さい値になり、トップヒープの不均衡を引き起こす可能性があるため、その子が配置されているヒープはスクリーニングされます。  
  56. s = j;
  57. }
  58. // S ビットが大きい場合、値は変更されません。それ以外の場合、S ビットは 2*s、4*s などに移動します。 。 。  
  59. 配列[s] = 配列[ 0 ];

<<:  異常検出のためのいくつかのグラフ分割アルゴリズム

>>:  分類アルゴリズムの概要

ブログ    
ブログ    

推薦する

...

ロンドンの顔認識で誤った人物が逮捕される:合理的な使用が鍵

顔認識の応用範囲は、アクセス制御やデバイスログインから空港や公共エリアの監視まで、非常に広範囲にわた...

人工知能が中小企業にもたらす5つのメリット

[[328993]] 【51CTO.com クイック翻訳】 AI 市場のトレンドはどのくらいの速さで...

Java プログラミング スキル - データ構造とアルゴリズム「バイナリ検索」

[[395207]]必要順序付けられた配列 {1,8,10,89,1000,1234} に対してバ...

...

AI天気予報には依然として人間の介入が必要

業界では、デート、マーケティング、ソーシャルメディアから宇宙探査、医療の進歩に至るまで、人工知能とそ...

研究により、ディープラーニングAIは乳がんリスクの予測に優れていることが判明

放射線学誌に掲載された新しい研究によると、ディープラーニングと呼ばれる高度な人工知能は、一般的に使用...

エッジ AI について知っておくべきことすべて

エッジ AI では、システムを他のシステムに接続する必要がないため、ユーザーはデータをリアルタイムで...

人工知能によってどの産業が繁栄し、どの産業が消滅するのでしょうか?

[[264320]]人工知能の概念は最近非常に人気があります。BAT(百度、テンセント、アリババ)...

AI時代のネイティブ:3歳でパズルを作り、5歳でプログラミングを学ぶ

[[241540]] 2018年世界ロボットコンテストで、子どもたちがロボットのプログラミングと制御...

インテリジェントオートメーションにおける人工知能の重要な役割

パンデミックによる職場の変化により、バックオフィス業務や生産活動を改善できるロボティック・プロセス・...

NYU のポスドクが、arXiv に 30 分遅れて論文を提出したというだけで ACL に拒否されたのですか?学者たちは憤慨し、ACLに二度と投票しないと誓う

ACL は国民を怒らせた!今朝、この投稿のせいで AI コミュニティ全体が騒然となった——ニューヨー...

EasyDLコンピューティング機能:10種類以上のチップをサポートし、速度が数倍速く、ワンクリックで展開可能

科学研究、金融、小売から工業、農業まで、ますます多くの業界やビジネス シナリオで、効率の向上とコスト...

Kafka のバイナリ検索アルゴリズムの改善

[[356205]]私は最近、Kafak のソース コードをいくつか研究し、Kafak の改良された...