簡體   English   中英

如何降低交換算法對5個數字進行排序的復雜度?

[英]How do I reduce complexity of my swap algorithm to sort 5 numbers?

我正在練習通過將5個數字相互比較來手動對5個數字進行排序,我不得不將其循環n ^ 2次,但我想減少它。

a1 = 100
a2 = 90
a3 = 45
a4 = 8
a5 = 0
i = 0
while i < 25:
    if a1 > a2:
        tmp = a1
        a1 = a2
        a2 = tmp
    elif a1 > a3:
        tmp = a1
        a1 = a3
        a3 = tmp
    elif a1 > a4:
        tmp = a1
        a1 = a4
        a4 = tmp
    elif a1 > a5:
        tmp = a1
        a1 = a5
        a5 = tmp
    elif a2 > a3:
        tmp = a2
        a2 = a3
        a3 = tmp
    elif a2 > a4:
        tmp = a2
        a2 = a4
        a4 = tmp
    elif a2 > a5:
        tmp = a2
        a2 = a5
        a5 = tmp
    elif a3 > a4:
        tmp = a3
        a3 = a4
        a4 = tmp
    elif a3 > a5:
        tmp = a3
        a3 = a5
        a5 = tmp
    elif a4 > a5:
        tmp = a4
        a4 = a5
        a5 = tmp
    i = i + 1
print(a1, a2, a3, a4, a5)

該代碼能夠對數字進行排序,但是正如您所見,我的循環運行到25次才對所有數字進行排序。

您正在使用時間復雜度為O(n^2)

您需要使用一些更快的算法,例如Merge sortQuick sort 但是對於以前排序的數據, Quick sort會產生不好的性能,這就是為什么我建議在此處使用Merge sort的原因。

另外,您可以使用Count sort算法,但是有時它不是一個好的解決方案。

因此,學習合並排序算法並使用它來獲得O(nlogn)時間復雜度!

正如其他人所建議的那樣,該算法不是很好-但是您可以使代碼更好(據我所知,這就是您所要的)。

而不是使用temp var進行交換,您可以執行

a1, a2 = a2, a1

消除三行。

也代替

i = 0
while i < 25
    ...
    i += 1

您可以使用

for i in range(25):
    ...

比較優雅

Merge Sort是理想的一般情況下,隨着訂單nlogn最好,平均和最壞的情況。 但是我建議否則,因為對於僅5個項目進行排序, Merge Sort不會比一些簡單的O(n^2)更好。

如果您正在尋找一種有效的方法來以最短的步驟對這5個數字進行排序,那么您可能會發現此答案很有幫助。 在這里,這5個數字僅用7步進行排序(最壞的情況)。 而即使是“ Merge Sort過程也至少需要8個步驟(忘記“合並排序”的復雜代碼)。

排序由5個整數組成的數組,最多7個比較( https://cs.stackexchange.com/a/10969

我只是想知道這段代碼是否可以更優化...

該代碼是冒泡排序。 該代碼只需要循環4次,而不是25次。 該代碼在第一個循環中將最大的元素移到a5,然后在第二個循環中將第二個最大的元素移到a4,然后在第三個循環中將a3移到第四個循環,而在第二個循環中將a2移到最小,在a1中保留最小的元素。 展開氣泡排序循環,需要10個比較和交換操作:

if a1 > a2: a1,a2 = a2,a1
if a2 > a3: a2,a3 = a3,a2
if a3 > a4: a3,a4 = a4,a3
if a4 > a5: a4,a5 = a5,a4
if a1 > a2: a1,a2 = a2,a1
if a2 > a3: a2,a3 = a3,a2
if a3 > a4: a3,a4 = a4,a3
if a1 > a2: a1,a2 = a2,a1
if a2 > a3: a2,a3 = a3,a2
if a1 > a2: a1,a2 = a2,a1

使用180個可能的5個元素分類網絡之一,可以將其減少為9個比較和交換操作。 如果操作是獨立的(不涉及相同的變量),則處理器優化可以並行執行一些比較和交換:

if a1 > a2: a1,a2 = a2,a1
if a3 > a4: a3,a4 = a3,a4
if a1 > a3: a1,a3 = a3,a1
if a2 > a5: a2,a5 = a5,a2
if a1 > a2: a1,a2 = a2,a1
if a3 > a4: a3,a4 = a3,a4
if a2 > a3: a2,a3 = a3,a2
if a4 > a5: a4,a5 = a4,a5
if a3 > a4: a3,a4 = a3,a4

與Sayooj Samuel的答案中的鏈接類似,使用交換和插入的組合,比較的次數可以從9個減少到7個,但是最多可以分配18個分配,可以用其他編程語言交換或移動。語句將導致大多數處理器上的無條件跳轉,並且存在更多的序列依賴性,因此這可能比排序網絡要慢。

if a1 > a2:      a1,a2       = a2,a1
if a3 > a4:      a3,a4       = a4,a3
if a1 > a3:      a1,a2,a3,a4 = a3,a4,a1,a2
if a3 > a5:
    if a1 > a5:  a1,a3,a4,a5 = a5,a1,a3,a4
    else:        a3,a4,a5    = a5,a3,a4
else:
    if a4 > a5:  a4,a5 = a5,a4
if a2 > a4:
    if a2 > a5:  a2,a3,a4,a5 = a3,a4,a5,a2
    else:        a2,a3,a4,a5 = a3,a4,a2,a5
else:
    if a2 > a3:  a2,a3       = a3,a2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM