2017-08-26 7 views
2

minとmaxの両方をスワップするダブルエンド選択ソートは、比較の数が同じであっても、通常の選択ソートより高速であると主張されています。私はそれがループのいくつかを取り除くことを理解しますが、比較の数が同じであれば、どのように速くなりますか?事前アルゴリズム - シングルエンドのものよりもダブルエンドの選択の方が実際に高速ですか?

+0

(ここでは、私は、各用語(n-i) + (n-i-1) + 1として2(n-i)を書き換えています) 'faster'は* machine *に依存します。 「比較の数は同じだが、比較の数は同じではない」:(入力)値のペアを比較し、非大型のものだけが最小の候補、最大ではないものを選択する。 – greybeard

+2

あなたは何を意味するか具体的になることができますか?すべてのケースで、2つのアルゴリズムがまったく同じ数の比較を実行することはほとんどありません。実際には説明していないサードパーティの主張を証明するか否かを尋ねることを基本としているため、現状のままで問題に答えることは難しいです。また、「ダブルエンド選択ソート」とは何かを推測しています。あなたが議論している実装へのリンクがありますか? –

+0

実際のデモンストレーションと数学的分析の両方で、ダブルエンド選択ソートは通常の選択ソートよりも多くの比較を実行するという私の答えを示しています。したがって、同じ数の比較を実行するというこの質問の仮定は間違っています。 –

答えて

0

おかげで、ここで選択ソートと比較を行っカウントダブルエンド選択ソートの実装です。

実行すると、ダブルエンド選択ソートは常により多く、の比較を通常の選択ソートよりも実行することがわかります。定期的な選択ソートのための比較の数であるためだ

import random 

def selsort(xs): 
    N = len(xs) 
    comparisons = 0 
    for i in xrange(N): 
     m = i 
     for j in xrange(i+1, N): 
      comparisons += 1 
      if xs[j] < xs[m]: m = j 
     xs[i], xs[m] = xs[m], xs[i] 
    return comparisons 

def deselsort(xs): 
    N = len(xs) 
    comparisons = 0 
    for i in xrange(N//2): 
     M = m = i 
     for j in xrange(i+1, N-i): 
      comparisons += 2 
      if xs[j] < xs[m]: m = j 
      if xs[j] >= xs[M]: M = j 
     xs[i], xs[m] = xs[m], xs[i] 
     if M == i: M = m 
     xs[N-i-1], xs[M] = xs[M], xs[N-i-1] 
    return comparisons 


for rr in xrange(1, 30): 
    xs = range(rr) 
    random.shuffle(xs) 
    xs0 = xs[:] 
    xs1 = xs[:] 
    print len(xs), selsort(xs0), deselsort(xs1) 
    assert xs0 == sorted(xs0), xs0 
    assert xs1 == sorted(xs1), xs1 

(n-1) + (n-2) + ... + 1 = n(n-1)/2 

ダブルエンド選択ソートの場合は、比較の数は(nが奇数のために - でもケースが似ている)であります

2(n-1) + 2(n-3) + 2(n-5) + ... + 2 
= (n-1)+(n-2)+1 + (n-3)+(n-4)+1 + ... 2+1+1 
= ((n-1) + (n-2) + ... + 1) + (n-1)/2 
= n(n-1)/2 + (n-1)/2 

+0

これは、ダブルエンドの選択の並べ替えが遅いことを意味しますか? – qunayu

+0

内部サイクルでは、最初の結果が偽であれば、2回目の比較が必要になります。あなたはこのようにいくつかの比較を保存します。 – Selindek

+0

あまり同じ量ではありませんが、比較の数をお互いに分けると限界は1になります。それは漸近的に同じかどうかですか? – maraca

関連する問題