简单的算法问题

时间:2010-12-17 13:33:11

标签: algorithm

观看iTunesU上免费的麻省理工学院算法课程,我坚持第一堂课。

采用插入排序,在最坏情况下(逆序数组/列表),它的时间实际上是T(n / 2),但是他们说这是平方。我以为这将是theta n。我失去了他们怎么说这是n平方。我坚持他们如何跳到结束这是n平方,维基百科也没有帮助。有人可以进一步愚蠢吗?

2 个答案:

答案 0 :(得分:4)

插入 - 排序以相反顺序开始的4个元素的数组:

4 3 2 1

首先,将“4”插入长度为1的数组中的正确位置(即什么都不做)。

接下来,将“3”插入长度为2的数组中的正确位置:

3 4 2 1

(我们不得不移动3和4)

接下来,将“2”插入长度为3的数组中的正确位置:

2 3 4 1

(我们不得不移动2,3和4)

接下来,插入“1”

1 2 3 4

(我们必须移动1,2,3和4)

我们执行了n个步骤,每个步骤k都需要移动k个元素(或k-1个交换,具体取决于你想看它的方式)。从1到n的k之和是Theta(n ^ 2)。

在简单的链表结构[*]的情况下,我们可以将对象移动到O(1)中的适当位置,但通常找到正确的位置仍需要线性搜索通过已经排序的数据部分,因此对于一般输入它仍然只有O(n ^ 2)。但是,链接列表的基本插入排序恰好可以很好地处理反向排序的数据,因为它总是会立即找到正确的插入位置。因此,对于此特定数据,我们分别获得O(1)的n个步骤,以获得总的O(n)运行时间

假设我们仍然选择要插入的第一个未排序元素,并且我们在每个步骤中向前搜索列表的排序部分,那么列表的最坏插入排序情况是已经排序的数据,并且是Theta( n ^ 2)再次。

[*]意思是,没有什么像跳过列表那样花哨。

答案 1 :(得分:2)

来自wikipedia

  

最坏的情况输入是一个数组   以相反的顺序排序。在这种情况下   内循环的每次迭代都会   扫描并移动整个排序   之前的数组的子部分   插入下一个元素。为了这   案例插入排序具有二次方   运行时间(即O(n2))。

第一个循环在数组/列表上进行迭代以进行排序,内部循环在部分排序的数组/列表上进行迭代。如果它已经排序,你可以看到你每次都一直迭代到排序容器的末尾。

这里有更多关于伪的解释:

for element in unsorted_container
    for current_element in sorted_container
        if element < current_element -> Will never happen since sorted in reverse order.
            InsertBefore(element, current_element)
    if element not inserted
        InsertAtEnd(element) <- Will always execute this part since it will always insert at end.