配列要素の読み取りと書き込みの数をカウントします。バブルソートを行うには、アクセスが必要です(最初の書き込みから最後への書き込み、最悪の場合、n回のスワップを行うために2回の読み取りと2回の書き込み)。バイナリ検索を行うために、我々は必要な2 ログのn + 2 のn + 1(2 ログnは最悪の場合には、バイナリサーチのため、、2をn個に配列要素を記述するために、その後1、右側に配列要素をシフトしますその適切な位置)。1 + 4 nn2 ログn + 2 n + 12 ログn2 n
したがって、両方の方法は配列の実装に対して同じ複雑さを持ちますが、バイナリ検索方法では、長期的には配列へのアクセスが少なくなります...漸近的には半分になります。当然、他の要因もあります。
実際には、より良い実装を使用して、実際の配列アクセスのみをカウントできます(挿入される要素へのアクセスはカウントしません)。バブルソートにを実行し、n + 2 nをログに記録できます2 n + 1端から検索し、道(賢く沿って移動させるので、レジスタ/キャッシュ・アクセスが安価であると配列アクセスが高価であれば...バイナリ検索挿入のためのバブルソート)はより良いかもしれませんが、漸近的にそうではありません。ログn + 2 n + 1
より良いソリューションには、異なるデータ構造の使用が含まれる場合があります。配列はO(1)アクセス(ランダムアクセス)を提供しますが、挿入と削除にコストがかかる場合があります。ハッシュテーブルにはO(1)の挿入と削除があり、アクセスにコストがかかります。他のオプションには、BSTやヒープなどがあります。挿入、削除、およびアクセスのためのアプリケーションの使用ニーズを検討し、より特殊な構造を選択することは価値があります。
また、n個の要素の並べ替えられた配列に要素を追加する場合、m個のアイテムを効率的に並べ替えてから、2つの配列をマージすることをお勧めします。また、ソートされた配列は、たとえばヒープを使用して効率的に構築できます(ヒープソート)。mnm