[英]What will be the time complexity of this algorithm by frequency count method?
以下是代碼:
for (i = n-1; i>0; i--)
for (j=0; j<i; j++)
if (arr[i] < arr[i+1])
{
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
我可以找到外部 for 外部 for 循環將執行 n 次,內部 for 循環將執行 i+i-1+i-2+....+1 i(i+1)/2=(i^ 2+i)/2 和 if 條件將被檢查 (i-1)*i/2=(i^2-i)/2 次但我對 if 條件中的陳述感到困惑,如果我也糾正我我上面的計算也是錯誤的。
對於n
=5, if
語句執行時遇到的i
和j
的值可以列舉如下:
(4,0) (4,1) (4,2) (4,3) (3,0) (3,1) (3,2) (2,0) (2,1) (1,0)
我特意安排了這樣的項目,因為它們形成了一個三角形。
#### ### ## #
為了計算這個三角形中有多少項,我們可以鏡像三角形並對每個項計數兩次。 根據您將鏡像項目放在右側還是下方,有兩種方法可以巧妙地做到這一點。
####o ###oo ##ooo #oooo
#### ###o ##oo #ooo oooo
無論哪種方式,通過檢查width 乘以 height ,都可以很容易地看出這是一個包含n * (n-1)
或(n-1) * n
項的矩形(兩種情況下的面積相等)。 並且由於我們對每個元素計算了兩次,因此我們可以除以二,並使用(n-1) * n / 2
作為項目數的公式。
因此,您的if
條件將精確計算(n-1) * n / 2
次。
您還正確地將此表達式擴展為((n*n) - (n)) / 2
,這也等於(n^2 - n) / 2
。
你說(i-1)*i/2
,使用i
而不是n
。 那是不對的。
您的代碼似乎打算計算冒泡排序。 並且if
條件及其塊的索引應始終為j
(而不是i
)。 (您在內部循環中反復比較arr[i]
和arr[i+1]
的相同值i
。在這種情況下,對於給定的i
值,實際交換最多會被評估一次,或者不在所有,取決於arr
的值。)
您想要的代碼可能是:
for (i = n-1; i>0; i--)
for (j=0; j<i; j++)
if (arr[j] < arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.