2010-12-12 8 views
4

私は、次の要素が来る前にベクトルをソートする必要がある、つまり、n個の合計がある場合、要素。マージソートはより良いはずです。しかし、マージソートには複雑さn log nがあるとよく言われています。一度にn個の要素をソートしようとするなら、それは当てはまります。それらが1つずつ来て、一時ベクトルをソートする必要がある場合、複雑さは\ sum_ {i = 2}^n i log(i)まで上がります。これはまだn^2未満であると推測しますが、確かにn log n以上です。逐次ソートアルゴリズム

これは間違いありませんか?

おかげ

答えて

2

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²)より大きくなります。

+1

あなたが挿入ソートについて話している場合、各ステップで、配列内にi要素と挿入したい要素があります。最悪の場合のシナリオでは、適切な場所を見つけるために必要なステップがあります。したがって、\ sum_ {i = 1}^n i = O(n^2)となります。あなたが複雑さO(1)でベクトルの前に(またはその終わりに)新しい要素を置き、すべてのものを並べ替えることができるので、マージの場合は異なります。これにより、\ sum i log(i) – Bob

+0

が最初に与えられます。挿入ソートでは内部的にO(i)を取得するためにバイナリツリーが使用されます。そうでなければ、最悪の場合のシナリオは、第2に、各ステップにO(i)、合計nステップがある場合、O(1)+ O(2)+ ... + O(n)= O (n^2) – Bob

+0

@Banana:挿入ソートについて言うことはすべて真ですが、**提案されたアルゴリズムは挿入ソート**ではないため、完全に無関係です。これは、O(i)ワーストケース(およびO(1)ベストケース)で機能するソート順配列アルゴリズムです。 N要素の挿入にはO(N²)の複雑さがあります。これは、各挿入後にマージソート(または任意のソート)を使用するよりもまだ小さいです。標準的な文献の –

関連する問題