簡體   English   中英

如何計算冒泡排序時間復雜度

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

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