[英]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 sort
或Quick 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.