当前位置: 首页 > 知识库问答 >
问题:

插入排序算法的改进

壤驷兴朝
2023-03-14

如果使用双向链表代替数组,是否有可能提高插入排序算法的运行时间?

非常感谢。

共有1个答案

郏志诚
2023-03-14

不,从某种意义上说不是。插入排序有几种变体,所以让我们讨论一下列表左侧按升序排序而右侧不排序的那种。在每次迭代中,我们找到未排序列表中的第一个(最左边的)元素,调用< code>x,然后通过排序列表向后迭代,查看该元素属于哪里。如果列表是一个数组,我们取出新元素,并在排序后的列表中向右移动条目,直到我们找到条目所属的位置,并把它放在那里。因此,我们遍历列表中的< code>n项,对于其中的每一项,我们遍历排序列表中的项,第一次迭代时为0项,下一次迭代时为1项,之后为2项,...高达< code>n因此,平均来说,对于O(n^2).的总运行时间,我们的< code>n次迭代中的每一次迭代,我们进行了高达< code>n/2次比较/交换

如果您将其设置为双链列表,则唯一会发生变化的是,在迭代排序列表时,不要向右移动一个项目,而是将它们保留在原处,然后将新项目放到适当的位置以修复列表。但它仍然是n / 2平均比较和指针反引用(以查找列表中的下一个节点),因此big-O运行时是相同的。实际上,在现实生活中可能会更慢,因为指针取消引用可能不适合缓存,并且比在数组中右向右移动项目需要更多的时间。

 类似资料:
  • 主要内容:插入排序算法的具体实现插入排序算法可以对指定序列完成升序(从小到大)或者降序(从大到小)排序,对应的时间复杂度为 。 插入排序算法的实现思路是:初始状态下,将待排序序列中的第一个元素看作是有序的子序列。从第二个元素开始,在不破坏子序列有序的前提下,将后续的每个元素插入到子序列中的适当位置。 举个简单的例子,用插入排序算法对 {14, 33, 27, 10, 35, 19, 42, 44} 实现升序排序的过程如下: 1)

  • JavaScript算法-插入排序 插入排序 插入排序有两个循环,外循环将数组元素挨个移动,而内循环则对外循环中选中的元素及它后面的那个元素进行比较。如果外循环中选中的元素比内循环中选中的元素小,那幺数组会向右移动,为内循环中的这个元素腾出位置。 function insertionSort() { var temp,inner; for (var outer = 1; outer <=

  • 本文向大家介绍C++插入排序算法实例,包括了C++插入排序算法实例的使用技巧和注意事项,需要的朋友参考一下 插入排序 没事喜欢看看数据结构和算法,增加自己对数据结构和算法的认识,同时也增加自己的编程基本功。插入排序是排序中比较常见的一种,理解起来非常简单。现在比如有以下数据需要进行排序: 10 3 8 0 6 9 2 当使用插入排序进行升序排序时,排序的步骤是这样的: 10 3 8 0 6 9 2

  • 我有一个带有前哨节点的双向链表,我需要用O(n^2)复杂度的插入排序来排序。我已经写了这段代码,但它并没有像它应该的那样工作。 对于插入排序,特别是代码,有什么帮助吗? 大小是我的列表中有多少个元素。我的哨兵有var=-1,所以当我处于头部时我想停止,这就是为什么我使用这个。 和只要我们处于某个位置,它就是真的!=哨兵节点。 在具体的例子中,我的列表中有35个整数: 5 9 1 1 1 1 1 1

  • 本文向大家介绍ruby实现的插入排序和冒泡排序算法,包括了ruby实现的插入排序和冒泡排序算法的使用技巧和注意事项,需要的朋友参考一下 1、插入排序 2、冒泡排序

  • 本文向大家介绍Java实现直接插入排序和折半插入排序算法示例,包括了Java实现直接插入排序和折半插入排序算法示例的使用技巧和注意事项,需要的朋友参考一下 直接插入排序​ 1 排序思想: 将待排序的记录Ri插入到已经排好序的记录R1,R2,……,R(N-1)中。 对于一个随机序列而言,就是从第二个元素开始,依次将这个元素插入到它之前的元素中的相应位置。它之前的元素已经排好序。 第1次排序:将第2个