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

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

概要

コンピュータサイエンスと数学において、ソートアルゴリズムとは、一連のデータを特定の順序で並べるアルゴリズムです。この記事では、バブル ソート、選択ソート、挿入ソート、クイック ソート、マージ ソートなど、よく使用されるソート アルゴリズムをいくつかまとめ、それぞれ 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 フレームワークが融合しています。

ブログ    
ブログ    
ブログ    

推薦する

...

...

コストを70%削減する秘訣: これらの企業はAIをコスト効率よく活用する方法を見つけました

過去 6 か月間で、ChatGPT によってもたらされた AI の人気は誰もが直感的に感じることがで...

10000000000!マイクロソフトはTransformerを改良し、一度に多くのトークンを記憶できるようにした

Microsoft Research Asia の最新の調査は少々衝撃的だ。彼らは、実際にトークンを...

音声認識の専門家が奇妙な学生事件によりジョンズ・ホプキンス大学から解雇され、怒ってFacebookを拒否し、中国に移住した

[[274404]] 8月16日、物議を醸していたジョンズ・ホプキンス大学の元教授ダニエル・ポービー...

人工知能産業は急速に発展しており、その規模は2020年には1600億ドルを超えるだろう

22日、「2018年中国IT市場年次大会」で、中国の中核人工知能産業の規模が2017年に700億元を...

Google Research: ゲーデル賞とクヌース賞受賞者が「脳内のテキスト表現」を分析

このオンラインセミナーで特に注目を集めた講演は、コロンビア大学のコンピューターサイエンス教授であるク...

...

エッジAIとクラウドAIのバランスを見つける

エッジ AI により、ローカライズされた処理を通じてリアルタイムの機械学習が可能になり、即時のデータ...

ビッグデータと人工知能 - 機械的思考から統計的思考へ

[[384196]]今日は、ビッグデータ、人工知能、認知問題の解決の関係ロジックについて話す記事を書...

45年前のマイクロソフトの予測が現実になりました!シャム:将来、AIの数は人類の人口を上回るだろう

本日開催された第8世代XiaoIce発表会で、XiaoIce会長で元マイクロソフトのグローバルエグゼ...