以下排序函数的时间复杂度是多少?

时间:2018-12-26 06:50:17

标签: algorithm sorting time-complexity

我已经为气泡排序编写了这段代码。有人可以向我解释一下此过程的时间复杂度。它的工作类似于2 for循环。但还是要确认时间复杂度。

public int[] sortArray(int[] inpArr)
{
    int i = 0;
    int j = 0;
    while(i != inpArr.length-1 && j != inpArr.length-1)
    {
        if(inpArr[i] > inpArr[i+1])
        {
            int temp = inpArr[i];
            inpArr[i] = inpArr[i+1];
            inpArr[i+1] = temp;
        }
        else
        {
            i++;
        }

        if(i==inpArr.length-1)
        {
            j++;
            i = 0;
        }
    }

    return inpArr;
}

2 个答案:

答案 0 :(得分:1)

这将具有O(n ^ 2)的时间复杂度。实际上,这可能同时是O(n ^ 2)和theta(n ^ 2)。

看看代码的逻辑。您正在执行以下操作:

  1. 遍历输入数组
  2. 如果当前项目大于下一个项目,请同时切换两者
  3. 如果不是这种情况,请增加索引(并本质上检查下一项,因此递归地执行步骤1-2)
  4. 一旦索引为输入数组的长度为1,即它遍历了整个数组,则将重置索引(i=0行),并增加j,然后重新启动过程。 / li>

这实际上确保了给定的数组将被循环两次,这意味着您将拥有最复杂的时间(大o或O(x)),时间复杂度为O(n ^ 2),但是给出了这段代码,您的平均(theta)时间复杂度将为theta(n ^ 2)。

在某些情况下,您可以具有n lg(n)的最佳情况(lambda),从而给出lambda(n lg *(n))时间复杂度,但是这种情况很少见而且我什至不确定此代码是否可以实现。

答案 1 :(得分:0)

您的时间复杂度为O(n^2)(作为最坏情况),O(n)(作为最佳情况)。您的平均方案仍然执行O(n ^ 2)比较,但交换次数少于O(n ^ 2)。这是因为从本质上来说,您所做的事情与两个for循环相同。如果您对算法效率感兴趣,建议您检查一下现有的排序库。从事这类工作的计算机科学家实际上是 intense 。Java的Arrays.sort()方法基于一个名为timsort的Python项目,该项目基于合并排序。您(和每一个)Bubble排序的缺点是,对于大型的无序数组,确实效率很低。了解更多here