一般的なソートアルゴリズムの概要

一般的なソートアルゴリズムの概要

概要

コンピュータサイエンスと数学において、ソートアルゴリズムとは、一連のデータを特定の順序で並べるアルゴリズムです。この記事では、バブル ソート、選択ソート、挿入ソート、クイック ソート、マージ ソートなど、よく使用されるソート アルゴリズムをいくつかまとめ、それぞれ Java コードを使用して実装し、図を使用して実装の原理を簡単に紹介します。

アルゴリズムの原理と実装

1. バブルソート

  • 概略図

  • 理解する

これは、ソートするリストを繰り返し反復処理し、隣接する項目の各ペアを比較して、順序が間違っている場合はそれらを交換することによって機能します。

  • Javaコード
  1. パブリッククラスBubbleSort {
  2.  
  3. //要素をソートするロジック
  4. 公共 静的void bubble_srt( int配列[]) {
  5. int n = 配列の長さ;
  6. 整数k;
  7. ( int m = n; m >= 0; m --) {  
  8. ( int i = 0; i < n - 1; i++) {
  9. k = i + 1;
  10. 配列[i] > 配列[k]の場合{
  11. swapNumbers(i, k, 配列);
  12. }
  13. }
  14. printNumbers(配列);
  15. }
  16. }
  17.  
  18. プライベート静的void swapNumbers( int i, int j, int [] 配列) {
  19.  
  20. 整数 温度;
  21. temp = 配列[i];
  22. 配列[i] = 配列[j];
  23. 配列[j] = temp ;
  24. }
  25.  
  26. プライベート静的void printNumbers( int [] input) {
  27.  
  28. ( int i = 0; i < input.length; i++) {
  29. システム.out.print (input[i] + ", " );
  30. }
  31. System.out.println ( "\n" ) ;
  32. }
  33.  
  34. 公共 静的void main(String[] args) {
  35. int [] 入力 = { 4, 2, 9, 6, 23, 12, 34, 0, 1 };
  36. bubble_srt(入力);
  37. }
  38. }

2. 選択ソート

  • 概略図

  • 理解する

内側のループは次に小さい (または大きい) 値を見つけ、外側のループはその値を適切な場所に配置します。

  • Javaコード
  1. パブリッククラスSelectionSort {
  2.  
  3. 公共 静的  int [] doSelectionSort( int [] arr){
  4.  
  5. ( int i = 0; i < arr.length - 1; i++)の場合
  6. {
  7. 整数 インデックス= i;
  8. ( int j = i + 1; j < arr.length; j++)の場合
  9. (arr[j] < arr[インデックス])の場合
  10. インデックス= j;
  11.  
  12. int小さい数値 = arr[インデックス];
  13. arr[インデックス] = arr[i];
  14. arr[i] = 小さい数値;
  15. }
  16. arrを返します
  17. }
  18.  
  19. 公共 静的void main(文字列a[]){
  20.  
  21. int [] arr1 = {10,34,2,56,7,67,88,42};
  22. int [] arr2 = doSelectionSort(arr1);
  23. ( int i : arr2){
  24. システム出力プリント(i )
  25. System.out.print ( ", " ) ;
  26. }
  27. }
  28. }

バブルソートと選択ソートの違い

1. バブルソートは隣接する位置にある 2 つの数値を比較しますが、選択ソートは最大値または最小値を見つけるために数値を比較します。

2. バブルソートでは比較の各ラウンドの後に位置が間違っている場合は位置を変更する必要がありますが、選択ソートでは比較の各ラウンドで位置を 1 回だけ変更する必要があります。

3. バブルソートは数字で位置を見つけるソートで、選択ソートは指定された位置の数字を見つけるソートです。

3. 挿入ソート

  • 概略図

  • 理解する

各ステップでは、すべての要素が挿入されるまで、ソートするレコードが以前にソートされた順序付きシーケンスに挿入されます。

  • Javaコード
  1. パブリッククラス挿入ソート{
  2.  
  3. 公共 静的void main(文字列a[]){
  4.  
  5. 整数[] arr1 = {10,34,2,56,7,67,88,42};
  6.  
  7. int [] arr2 = doInsertionSort(arr1);
  8.  
  9. ( int i : arr2){
  10.  
  11. システム出力プリント(i )
  12.  
  13. System.out.print ( ", " ) ;
  14.  
  15. }
  16.  
  17. }
  18.  
  19. 公共 静的  int [] doInsertionSort( int [] 入力){
  20.  
  21. 整数 温度;
  22.  
  23. ( int i = 1; i < input.length; i++) {
  24.  
  25. ( int j = i ; j > 0 ; j --) {  
  26.  
  27. 入力[j] < 入力[j-1])の場合{
  28.  
  29. temp = 入力[j];
  30.  
  31. 入力[j] = 入力[j-1];
  32.  
  33. 入力[j-1] = temp ;
  34.  
  35. }
  36.  
  37. }
  38.  
  39. }
  40.  
  41. 入力を返します
  42.  
  43. }
  44.  
  45. }

4. クイックソート

  • 概略図

  • 理解する

元の問題を、規模は小さいが構造は元の問題に似ているいくつかのサブ問題に分解し、これらのサブ問題を再帰的に解決してから、これらのサブ問題の解決策を元の問題の解決策に組み合わせます。

  1. パブリッククラスQuickSort {
  2.  
  3. プライベートint配列[];
  4. プライベートint長さ;
  5.  
  6. パブリックvoidソート( int []inputArr){
  7.  
  8. (inputArr == null || inputArr.length == 0)の場合{
  9. 戻る;
  10. }
  11. this.array = 入力Arr;
  12. 長さ = inputArr.length;
  13. クイックソート(0, 長さ - 1);
  14. }
  15.  
  16. プライベート void クイックソート( int下位インデックス、 int上位インデックス) {
  17.  
  18. int i = 下位インデックス;
  19. j = 上位インデックス;
  20. // ピボット番号を計算します。ピボットを中間のインデックス番号として取得します。
  21. intピボット = 配列[lowerIndex+(higherIndex-lowerIndex)/2];
  22. // 2つの配列分割する
  23. i <= j の場合
  24. /**
  25. *各反復  左側
  26. *ピボット値よりも大きくまた、数値を特定します
  27. *から ピボット値より小さい右側検索が終了する
  28. *完了したら両方の数値を交換します。
  29. */
  30. 配列[i] < ピボット) {
  31. 私は++;
  32. }
  33. while (配列[j] > ピボット) {
  34. j --;  
  35. }
  36. もし (i <= j) {
  37. 交換番号(i, j);
  38. //動く 索引  両側次の位置
  39. 私は++;
  40. j --;  
  41. }
  42. }
  43. // quickSort() メソッドを再帰的に呼び出す
  44. (下限インデックス < j)の場合
  45. クイックソート(下位インデックス、j);
  46. (i < より高いインデックス)
  47. クイックソート(i, 上位インデックス);
  48. }
  49.  
  50. プライベートvoid exchangeNumbers( int i, int j) {
  51. 整数  temp = 配列[i];
  52. 配列[i] = 配列[j];
  53. 配列[j] = temp ;
  54. }
  55.  
  56. 公共 静的void main(文字列a[]){
  57.  
  58. MyQuickSort ソーター = 新しい MyQuickSort();
  59. int [] 入力 = {24,2,45,20,56,75,2,56,99,53,12};
  60. ソート器.sort(入力);
  61. ( int i:入力) {
  62. システム出力プリント(i )
  63. システム出力を印刷します( " " ) ;
  64. }
  65. }
  66. }

5. マージソート

  • 概略図

  • 理解する

ソートするシーケンスを長さ 1 の複数のサブシーケンスに分割し、これらのシーケンスを 2 つずつ結合します。長さ 2 の順序付けられたシーケンスをいくつか取得し、これらのシーケンスを 2 つずつ結合します。長さ 4 の順序付けられたシーケンスをいくつか取得し、これらのシーケンスを 2 つずつ結合します。これらが 1 つのシーケンスに直接結合されるまで、これを繰り返します。

  • Javaコード
  1. パブリッククラス MergeSort {
  2.  
  3. プライベートint []配列;
  4. プライベートint [] tempMergArr;
  5. プライベートint長さ;
  6.  
  7. 公共 静的void main(文字列a[]){
  8.  
  9. int [] 入力引数 = {45,23,11,89,77,98,4,28,65,43};
  10. MyMergeSort mms = 新しい MyMergeSort();
  11. mms.sort(入力配列);
  12. ( int i:inputArr )の場合{
  13. システム出力プリント(i )
  14. システム出力を印刷します( " " ) ;
  15. }
  16. }
  17.  
  18. パブリックvoidソート( int inputArr[]) {
  19. this.array = 入力Arr;
  20. 入力Arrの長さは、次の式で計算されます。
  21. this.tempMergArr = 新しいint [長さ];
  22. マージソートを実行します(0, 長さ - 1);
  23. }
  24.  
  25. プライベートvoid doMergeSort( int下位インデックス、 int上位インデックス) {
  26.  
  27. (下限インデックス < 上限インデックス)の場合 {
  28. int中間 = 下位インデックス + (上位インデックス - 下位インデックス) / 2;
  29. // 以下の手順では配列左側をソートします
  30. マージソートを実行します(下位インデックス、中間);
  31. // 以下の手順では配列右側をソートします
  32. doMergeSort(中間 + 1、上位インデックス);
  33. // 両側をマージします
  34. mergeParts(下位インデックス、中間インデックス、上位インデックス);
  35. }
  36. }
  37.  
  38. プライベート void mergeParts( int下位インデックス、 int中間、 int上位インデックス) {
  39.  
  40. ( int i = 下位インデックス; i <= 上位インデックス; i++) {
  41. tempMergArr[i] = 配列[i];
  42. }
  43. int i = 下位インデックス;
  44. int j = 中央 + 1;
  45. int k = 下位インデックス;
  46. (i <= 中間 && j <= 上位インデックス) {
  47. tempMergArr[i] <= tempMergArr[j] の場合 {
  48. 配列[k] = tempMergArr[i];
  49. 私は++;
  50. }それ以外{
  51. 配列[k] = tempMergArr[j];
  52. j++;
  53. }
  54. 関数
  55. }
  56. (i <= 中間) {
  57. 配列[k] = tempMergArr[i];
  58. 関数
  59. 私は++;
  60. }
  61. }
  62. }

一般的なソートアルゴリズムの複雑さ

<<:  この10ステップを理解すれば、8歳の子供でもディープラーニングを理解できる

>>:  「Hands-on Deep Learning」の PyTorch バージョンはオープンソースです。最も美しい DL ブックと素晴らしい DL フレームワークが融合しています。

ブログ    

推薦する

...

...

Appleのアプリランキングアルゴリズム調整の裏側:ランキング管理企業が一夜にして沈黙

4月1日早朝のニュース:3月初旬から、AppleはAppランキングアルゴリズムを徐々に調整し、ランキ...

非常に少ないデータで大規模なモデルを微調整するにはどうすればよいでしょうか?

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

世界の半導体サプライチェーンにおけるリスクを排除するにはどうすればよいでしょうか?

過去数年間、テクノロジー業界は半導体サプライチェーンにおける前例のない混乱の影響を感じてきました。研...

エッセンス共有サイトのランキングアルゴリズムのまとめ

ウェブサイトのランキングは、ウェブサイトの最適化を行うすべての人が最も気にしていることです。しかし、...

...

ビル・ゲイツ:AIが最大の影響を与えるには何十年もかかる

[[271684]]ビル・ゲイツは、世界を変えるトレンドを予見し、それを活用することで、史上最も成功...

...

...

スマートメーター: スマートなエネルギー管理への道

新型コロナウイルス感染症のパンデミックにより、配電事業者はメーターの読み取りとその後の請求という基本...

生体認証市場における 4 つの「ホットアイテム」: 音声認識、顔認識など。

生体認証市場を見ると、顔認証や虹彩認証などの割合が増加しており、一般の人々のこれらの技術に対する理解...

ChatGPTがチップ設計に力強く参加します!専門的なハードウェア記述言語を学ぶ必要はなく、人間の言語を話すだけでよい

CPU 開発における大きな問題は、ChatGPT とのチャットで解決できるでしょうか?ニューヨーク州...

PaLMを超えて!北京大学のマスターがDiVeRSeを提案し、NLP推論ランキングを一新した。

1,750億のパラメータを持つGPT-3や5,400億のパラメータを持つPaLMなど、大規模言語モ...