EDIT 2:
\sum_{i=1}^N i log i > \sum_{i=1}^N i = O(N²)
EDITは:どうやら、あなたはポイントを逃したので、私は明確にしようとするでしょう。
まず、N個の要素を配列に挿入し、挿入が完了するたびに配列がソートされるようにしながら、複雑さO(N²)で実行できます。要素が挿入される位置を見つけるためにバイナリ検索を使用して、配列をソートされているので
- :あなたは要素を挿入するために、次のアルゴリズムを使用することができます。 O(log i)時間をとります。ここで、iは配列の現在のサイズです。
- すべての要素を1つ右の位置に移動して要素を挿入します。これは、i要素まで移動することを伴うので、O(i)です。
このアルゴリズムをN個の挿入に対して繰り返すと、\ sum_i(i + log i)= O(N²)が得られます。
非常に明確にするには:これは挿入ソートではありません。挿入ソートでは、すべての要素を再挿入することによって配列全体をソートする必要がありますが、このアルゴリズムは1つの要素を挿入するだけです。
第2に、この操作をO(N²)より速く行うことはできません。ソートされた配列を維持しながらサイズiの配列に1つの要素を挿入すると、O(i)よりも複雑ですi要素。 この基本的事実回避するための回避策だけではありません:あなたは[2,3,..,i]
に1
を挿入した場合、結果は、要素2を意味し、[1,2,3,..,i]
である3が..私を移動するを持っていました。
したがって、合計は\ sum_i i = O(N²)より大きくなります。
あなたが挿入ソートについて話している場合、各ステップで、配列内にi要素と挿入したい要素があります。最悪の場合のシナリオでは、適切な場所を見つけるために必要なステップがあります。したがって、\ sum_ {i = 1}^n i = O(n^2)となります。あなたが複雑さO(1)でベクトルの前に(またはその終わりに)新しい要素を置き、すべてのものを並べ替えることができるので、マージの場合は異なります。これにより、\ sum i log(i) – Bob
が最初に与えられます。挿入ソートでは内部的にO(i)を取得するためにバイナリツリーが使用されます。そうでなければ、最悪の場合のシナリオは、第2に、各ステップにO(i)、合計nステップがある場合、O(1)+ O(2)+ ... + O(n)= O (n^2) – Bob
@Banana:挿入ソートについて言うことはすべて真ですが、**提案されたアルゴリズムは挿入ソート**ではないため、完全に無関係です。これは、O(i)ワーストケース(およびO(1)ベストケース)で機能するソート順配列アルゴリズムです。 N要素の挿入にはO(N²)の複雑さがあります。これは、各挿入後にマージソート(または任意のソート)を使用するよりもまだ小さいです。標準的な文献の –