[英]how to calculate Bubble sort Time Complexity
我試圖理解數據結構和不同的算法,然后我對測量冒泡排序時間復雜度感到困惑。
for (c = 0; c < ( n - 1 ); c++) {
for (d = 0; d < n - c - 1; d++) {
if (array[d] > array[d+1]) /* For descending order use < */
{
swap = array[d];
array[d] = array[d+1];
array[d+1] = swap;
}
}
}
現在每個大 O 都告訴最佳情況 O(n)、平均情況 (n2) 和最壞情況 (n2)。但是當我看到代碼時,發現在第一階段內循環運行 n 次,然后在第二階段 n - 1 和 n - 2 等。 這意味着在每次迭代中它的價值都會下降。 例如,如果我有 a[] = {4, 2, 9, 5, 3, 6, 11} 所以比較的總數將是 -
1st Phase - 7 time
2nd phase - 6 time
3rd Phase - 5 time
4th Phase - 4 time
5th Phase - 3 time
6th Phase - 2 time
7th Phase - 1 time
因此,當我計算時間時,它看起來像 = (7 + 6 + 5 + 4 + 3 + 2 + 1) + 7 = 35,但根據文檔,最壞的時間復雜度是 n2。
所以有人可以告訴我如何計算正確的值。
讓我們來看看 Big O for Bubble Sort 的案例
情況 1)O(n)(最佳情況)如果數組已經排序,就會出現這種時間復雜度,這意味着沒有發生交換並且只有 n 個元素的 1 次迭代
情況 2) O(n^2)(最壞情況)最壞情況是數組已經排序但按降序排列。 這意味着在第一次迭代中,它必須查看 n 個元素,然后它會查看 n - 1 個元素(因為最大的整數在末尾),依此類推,直到發生 1 次比較。 Big-O = n + n - 1 + n - 2 ... + 1 = (n*(n + 1))/2 = O(n^2)
在您的示例中,它可能不會檢查每個階段中的這么多元素,因為數組不是按降序排列的。
所以你已經注意到完成的比較總數是 (n - 1) + ... + 2 + 1。這個總和等於 n * (n - 1) / 2(參見三角形數),它等於0.5 n^2 - 0.5 n 顯然是 O(n^2)。
它在兩個元素之間進行比較。 所以在第一階段 - n-1 比較。 即,6 第二階段 - n-2 比較。 即,5 依此類推直到 1。因此,sum = n(n-1)/2 即 O(n^2)。
如果有任何錯誤,您可以更正......
O(n^2) = n(n-1)/2
是正確的。
如上例中的 5 個元素。
5(5-1)/2 == 10.
5(5+1)/2 != 10.
在這里解釋最壞的情況:
elements = raw_input("enter comma separated elements : ")
elements = elements.split(',')
elements = map(int, elements)
length = len(elements)
for i in xrange(length - 1):
print "outer pass : ", i
for j in xrange(length - i - 1):
print "inner pass : ", j
if elements[j] > elements[j + 1]:
elements[j + 1], elements[j] = elements[j], elements[j + 1]
print "elements : ", elements
print elements
輸出 :
輸入逗號分隔的元素:5,4,3,2,1
外傳:0
內部通行證:0
元素:[4, 5, 3, 2, 1]
內傳:1
元素:[4, 3, 5, 2, 1]
內傳:2
元素:[4, 3, 2, 5, 1]
內傳:3
元素:[4, 3, 2, 1, 5]
外傳:1
內部通行證:0
元素:[3, 4, 2, 1, 5]
內傳:1
元素:[3, 2, 4, 1, 5]
內傳:2
元素:[3, 2, 1, 4, 5]
外傳:2
內部通行證:0
元素:[2, 3, 1, 4, 5]
內傳:1
元素:[2, 1, 3, 4, 5]
外傳:3
內部通行證:0
元素:[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
因此第一次迭代掃描所有 n 個元素,它將在下一次迭代中掃描 n - 1 個元素。 對於所有元素,依此類推。
n + n - 1 + n - 2 ... + 1 = (n * (n + 1))/2 = O(n^2)
: This time complexity can occur if the array is already sorted.:如果數組已經排序,就會出現這種時間復雜度。 這意味着不會發生交換,並且只有 n 個元素的 1 次迭代將在那里。
所以時間復雜度是O(n) 。
最壞情況:如果數組已經排序但是降序排列,則可能會出現這種時間復雜度。
在第一次迭代中,比較次數 = n-1
在第二次迭代中,比較次數 = n-2
………………………………………………………………………………………………………………………………………………………… ………………
………………………………………………………………………………………………………………………………………………………… ………………
……………………………………………………………………………………………………………………………………………………………… ………………
在第(n-2) 次迭代中,比較次數 = 2
在第(n-1) 次迭代中,比較次數 = 1
對於 n 個元素,總迭代次數 = n-1
比較總數S = (n-1)+ (n-2) +........ + 2 + 1
我們也可以這樣寫S = 1 + 2 + ........+(n-2) + (n-1)
………………………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………………… ...................... 2S = n + n + ...... + n + n ... . [添加兩行]
2S = n(n-1) ..... [作為總迭代次數 = n-1]
S = n(n-1)/2
在多項式函數中,n 的最高階被認為是時間復雜度。
所以,時間復雜度是O(n^2)
對於 n 個數字,完成的比較總數將為 (n - 1) + ... + 2 + 1。該總和等於 (n-1) * n / 2(參見三角形數),等於 0.5 n^2 - 0.5 n 即 O(n^2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.