2017-08-26 59 views
2

雙端選擇排序,即交換最小和最大的排序,聲稱更快是一個普通的選擇排序,即使認爲比較的數量是相同的。我明白,它擺脫了一些循環,但如果比較的數量保持不變,它們如何更快?算法 - 雙端選擇排序真的比單端排序更快嗎?

在此先感謝

+0

'更快'取決於*機器*。儘管比較次數相同並不成立:比較(輸入)值對,只有非更大值是最小值的候選值,非最小值是最大值。 – greybeard

+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 

(在這裏,我重寫每學期2(n-i)(n-i) + (n-i-1) + 1

+0

這是否意味着雙倍結束選擇排序較慢? – qunayu

+0

在內部循環中,如果第一個結果爲假,則只需進行第二次比較。這樣可以節省一些比較。 – Selindek

+0

好吧,不完全相同的數量,但如果我們將相互比較的數量除以1,那麼限制將會是1.所以它就像漸近地相同或不相似? – maraca

相關問題