インタビュアー:バブリング、挿入、選択という3つの一般的なソートアルゴリズムを知っていますか?挿入ソートの方が人気があるのはなぜですか?

並べ替えアルゴリズムは、私たち全員が最初に学ぶときに接触するものでなければならず、ほとんどの人が学ぶ最初のアルゴリズムでなければなりません。サルの分類、睡眠の分類、麺の分類など、多くの一般的な分類アルゴリズムがあります。ここでは、最も一般的で古典的な並べ替えアルゴリズムのみを学習します。

アルゴリズムの時間の複雑性に応じて、次の3つのカテゴリに分類できます。分類から学び、記憶を深め、アルゴリズムをマスターします。

「ソーティングアルゴリズム」の分析方法

ソートアルゴリズムの実行効率

  1. ベストケース、ワーストケース、平均ケースの時間の複雑さ
  2. 時間複雑度係数、定数、低レベル
  3. 比較と交換(または移動)の数

並べ替えアルゴリズムのメモリ消費

アルゴリズムのメモリ消費量は、スペースの複雑さによって測定でき、並べ替えアルゴリズムも例外ではありません。ただし、並べ替えアルゴリズムのスペースの複雑さを考慮して、所定の位置に並べ替えられる(並べ替えられる)新しい概念も導入しました。インプレースソートアルゴリズムは、空間の複雑さがO(1)であるソートアルゴリズムを特に指します。

ソートアルゴリズムの安定性

実行効率とメモリ消費だけでソートアルゴリズムのパフォーマンスを測定するだけでは不十分です。並べ替えアルゴリズムについては、重要な指標である安定性もあります。概念は、ソートされるシーケンスに等しい値の要素がある場合、等しい要素の元の順序はソート後に変更されないということです。

例を挙げて説明します。たとえば、サイズで並べ替えた2、9、3、4、8、3のデータセットがあります。これは、2、3、3、4、8、9です。このデータセットには2つの3があります。特定の並べ替えアルゴリズムで並べ替えた後、2つの3の順序が変わらない場合は、この並べ替えアルゴリズムを安定した並べ替えアルゴリズムと呼びます。前から後ろへの順序が変更された場合、対応する並べ替えアルゴリズムは不安定と呼ばれます並べ替えアルゴリズム。

バブルソート(Bubble Sort)

バブルソートは、隣接する2つのデータに対してのみ機能します。各バブリング操作では、隣接する2つの要素を比較して、サイズ関係の要件が満たされているかどうかを確認します。それらが満足されない場合、それらを交換させます。1回のバブリングで、少なくとも1つの要素が本来あるべき場所に移動します。n回繰り返すと、n個のデータの並べ替えが完了します。

例を使用して、バブル分類のプロセス全体を示します。一連のデータ4、5、6、3、2、1を小さいものから大きいものに並べ替えます。最初のバブリング操作の詳細なプロセスは次のとおりです。

バブリング操作の後、6つの要素が正しい場所に格納されていることがわかります。すべてのデータを並べ替えるには、このような6つのバブリング操作を実行するだけで済みます。

実際、今述べたバブリングプロセスは最適化できます。バブリング操作のためのデータ交換がない場合は、注文に達したことを意味し、その後のバブリング操作を続行する必要はありません。ここに別の例があります。6つの要素を並べ替えるのに必要なバブリング操作は4つだけです。

バブルソートアルゴリズムの原理は比較的理解しやすいので、以下に具体的なコードを掲載します。コードを組み合わせて、前述の原理を確認できます。

挿入ソート

最初に、配列内のデータを2つの間隔(ソートされた間隔とソートされていない間隔)に分割します。最初のソートされた間隔には、配列の最初の要素である1つの要素しかありません。挿入アルゴリズムの核となる考え方は、並べ替えられていない間隔の要素を取得し、並べ替えられた間隔で適切な挿入位置を見つけて挿入し、並べ替えられた間隔データが常に正しいことを確認することです。ソートされていない間隔の要素が空になり、アルゴリズムが終了するまで、このプロセスを繰り返します。

図に示すように、ソートされるデータは4、5、6、1、3、2で、ソートされた間隔は左側に、ソートされていない間隔は右側にあります。

挿入ソートには、2つの操作も含まれます。1つは要素の比較、もう1つは要素の移動です。データaをソートされた間隔に挿入する必要がある場合、適切な挿入位置を見つけるために、aのサイズをソートされた間隔の要素と比較する必要があります。挿入ポイントを見つけたら、要素aを挿入するためのスペースを空けるために、挿入ポイントの後の要素の順序を1つ後ろに移動する必要もあります。

以下に示すように、コード部分は難しくありません。

ここでは、順序付けられたデータを最初から最後までトラバースすることに注意してください。

並べ替えを選択

選択ソートアルゴリズムの実装のアイデアは、挿入ソートに似ており、ソートされた間隔とソートされていない間隔にも分けられます。ただし、選択ソートは、ソートされていない間隔で最小の要素を毎回検索し、ソートされた間隔の最後に配置します。

これも比較的単純です。コードを見てください。

拡大する

バブルソートと挿入ソートの時間の複雑さはどちらもO(n2)で、どちらもインプレースソートアルゴリズムです。挿入ソートがバブルソートよりも人気があるのはなぜですか?

回答:コード実装の観点から見ると、バブルソートのデータ交換は挿入ソートのデータ移動よりも複雑です。バブルソートには3つの代入演算が必要ですが、挿入ソートには1つしか必要ありません。この操作を見てみましょう:


冒泡排序中数据的交换操作:
if (a[j] > a[j+1]) { // 交换
   int tmp = a[j];
   a[j] = a[j+1];
   a[j+1] = tmp;
   flag = true;
}

插入排序中数据的移动操作:
if (a[j] > value) {
  a[j+1] = a[j];  // 数据移动
} else {
  break;
}

割り当てステートメントの実行時間をおおまかに単位時間(unit_time)としてカウントし、バブルソートと挿入ソートを使用して、Kの逆順で同じ配列をソートします。バブル・ソートでは、K回の交換操作が必要であり、毎回3つの割り当てステートメントが必要なので、合計交換操作時間は3 * K単位時間です。挿入ソートでのデータ移動操作には、K単位時間しか必要ありません。

これは非常に理論的な分析にすぎません。実験のために、上記のバブルソートおよび挿入ソートJavaコードのパフォーマンス比較テストプログラムを作成しました。ランダムに生成された10,000個の配列にそれぞれ200個のデータが含まれています。私のマシンでは、バブルソートと挿入ソートアルゴリズムを使用してソートしています。バブルソートアルゴリズムの実行に約555ms かかりますが挿入ソートの完了に約115ms しかかかりません!

総括する

ソートアルゴリズムを分析して評価するには、実行効率、メモリ消費量、安定性の3つの側面からソートアルゴリズムを調べる必要があります。これらの3種類の時間の複雑さは、O(n2)ソートアルゴリズム、バブルソート、挿入ソート、選択ソートです。

推奨読書

最近、ByteとBATにインタビューし、Javaコアテクノロジー、JVM、Java並行性、SSM、マイクロサービス、データベース、データ構造などをカバーするインタビュー資料「Java Interview BAT Clearance Manual」をまとめました。入手方法:「ウォッチング」をクリックし、公式アカウントをフォローして666に返信すると、さらに多くのコンテンツが続々と提供されます

 

 

おすすめ

転載: blog.csdn.net/taurus_7c/article/details/105170821