排序算法时间复杂度

时间:2014-04-08 21:23:23

标签: time-complexity

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?

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)

您可以按照以下步骤进行操作:

enter image description here