void MySort(table T[0..n-1]: array of integers)
{
for m = 0 to n-2 do //will run n+1
{
j = m; // will run n times
for k = m+1 to n-1 do /will run n^2 +n
{
if T[k] < T[j] then j = k; //will run n^2 times
}
swap(T[m], T[j]); //will run 3*n times
}
}
我必须找到此算法的时间复杂度,并找到它所属的类别。 所以我计算它将运行2n ^ 2 + 6n + 1,它的类别是O(n ^ 2) 我想知道我是否正确,另一个问题是Ω也是n ^ 2和Θ也是n ^ 2?
答案 0 :(得分:1)
根据维基百科(http://en.wikipedia.org/wiki/Big_O_notation#Family_of_Bachmann.E2.80.93Landau_notations)
的定义大Omicron O - 函数渐近上限(由常数因子决定) 你对O(n ^ 2)的分析是正确的(尽管你对交换的分析是错误的)
BigOmegaΩ - 函数以渐近为界 你对Ω(n ^ 2)的分析是正确的(尽管你对交换的分析是错误的)
大ThetaΘ - 由g渐近地上下限制 由于Big Omnicron和Big Omega是相同的,大Theta与那两个相同:Θ(n ^ 2)
各部分的详细分析:
外部循环确实运行n-1
,并且每次迭代都有一个内部循环和交换。因此,还有n-1
次互换。
内部循环体每m运行n-m次,这是数学变得复杂的地方。 T[k] < T[j]
执行((n-1)-1)(n-2)/2 = (n^2)/2+2-2
次(我认为)。
j = k
更难,因为现在可能涉及概率。我认为sum of lg(m)
m
是数字1 to n-1
。经过大量的数学计算,我认为那是lg(n!)/0.60206
,不,我不知道这个常数来自何处或意味着什么。
你应该知道,你的代码是Selection Sort,选择的维基百科页面可以支持我的想法。
答案 1 :(得分:0)
您可以按照以下步骤进行操作: