以下應用/理論問題出現在我的算法類中,我得到了來自我的教授和TA的相互矛盾的答案。在最佳情況下Bubblesorting 25個元素的陣列
在(a)最差的情況下需要多少次比較來對數組進行冒泡? (b)最好的情況?
我知道,標準冒泡算法是
for i = 0 to n - 2 for j = n - 1 to i + 1 if A[j - 1] > A[j] swap(A[j - 1], A[j])
其實我用Google搜索這個問題和問題的答案其實是分別300
和24
。但我對這裏的「比較」一詞感到困惑。我們認爲什麼是比較?我們是否認爲它只是if
檢查自己,或者它執行的代碼塊是否正確?在最壞的情況下,交換和if
語句將執行總計n(n-1)/2
次。然而,在最佳情況下,if
聲明將像以前一樣檢查有效性n(n-1)/2
次,但由於數組在最佳情況下排序,因此不會發生交換。這意味着最差情況和最好情況下的比較次數是相同的,不是嗎?
我的教授說「比較」的意思是「比較這兩個要素」,但沒有更多解釋。我的電訊局長認爲這可能基於for
循環的執行次數。
雖然它讓我變得更加困惑:我們如何從算法的這個定義中提取出最好情況下的bubblesort爲O(n)
?顯然,在最好的情況下不會發生交換,但內循環將在外循環中爲每個值i
運行,因此算法會遍歷數組n(n-1)/2
次。究竟什麼是n-1
次這裏,給我們O(n)
?
我找到的原始問題的答案使用優化的bubblesort算法,該算法僅使用1 for循環,如果沒有交換髮生,則退出。這是一個更好的算法來使用這個問題嗎?即,
bubblesort_optimized(A) assume we are not done sorting while we are not done sorting assume we're done sorting traverse the list element by element from i = 1 to n - 1. if A[i-1] > A[i], swap if a swap occurs, we are not done sorting
在這種特殊情況下,這是令人難以置信明顯在這一切的來源。但是講座和我們的書中的算法從來沒有提到這一點。
感謝您的閱讀!