插入排序算法的改进
Improvement On Insertion Sort Algorithm
如果使用双向链表而不是数组,是否可以改进插入排序算法的 运行 时间?
谢谢。
不,无论如何都不是大O。插入排序有几种变体,所以我们来谈谈列表左侧按升序排序而右侧未排序的一种。在每次迭代中,我们找到未排序列表中的第一个(最左边)元素,将其称为 x
,然后向后遍历已排序列表以查看该元素所属的位置。如果列表是一个数组,我们将取出新元素并向右移动排序列表中的项目,直到找到该项目所属的位置并将其放在那里。因此,我们遍历列表中的 n
个项目,对于每个项目,我们遍历排序列表中的项目,第一次迭代时为 0 项,下一次为 1,之后为 2,...向上到 n
所以,平均而言,我们每次 n
迭代的总运行时间为 O(n^2)
。
如果你把它变成一个双向链表,唯一改变的是,当你遍历排序列表时,不是将项目向右移动一个,而是将它们留在原处,然后你放下你的新项目改为修复列表。但它仍然是 n/2
平均比较和指针取消引用(以找到列表中的下一个节点),因此 big-O 运行时是相同的。它实际上在现实生活中可能更慢,因为指针取消引用可能对缓存不友好,并且需要更多时间在数组中向右移动项目。
如果使用双向链表而不是数组,是否可以改进插入排序算法的 运行 时间?
谢谢。
不,无论如何都不是大O。插入排序有几种变体,所以我们来谈谈列表左侧按升序排序而右侧未排序的一种。在每次迭代中,我们找到未排序列表中的第一个(最左边)元素,将其称为 x
,然后向后遍历已排序列表以查看该元素所属的位置。如果列表是一个数组,我们将取出新元素并向右移动排序列表中的项目,直到找到该项目所属的位置并将其放在那里。因此,我们遍历列表中的 n
个项目,对于每个项目,我们遍历排序列表中的项目,第一次迭代时为 0 项,下一次为 1,之后为 2,...向上到 n
所以,平均而言,我们每次 n
迭代的总运行时间为 O(n^2)
。
如果你把它变成一个双向链表,唯一改变的是,当你遍历排序列表时,不是将项目向右移动一个,而是将它们留在原处,然后你放下你的新项目改为修复列表。但它仍然是 n/2
平均比较和指针取消引用(以找到列表中的下一个节点),因此 big-O 运行时是相同的。它实际上在现实生活中可能更慢,因为指针取消引用可能对缓存不友好,并且需要更多时间在数组中向右移动项目。