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

排序算法:插入排序-讲座中给出的伪代码似乎是错误的

凌通
2023-03-14

我在上一门叫做算法的基础课。我们正在研究排序算法;我们得到了以下伪代码作为插入排序算法的示例。然而我认为这是错误的。

For i in {2,..,n}:
    For j in {i,..,2}:
        If a(j)<a(j-1), swap a(j) and a(j-1)
        Else, Break

我理解第一行——它从2开始,因为第一张卡是“已经订购的”,因为它是迄今为止唯一的一张卡。

第二行是错误的吗?我们怎么能从i到2使用j呢?当然,这在未来不可能成立。另外,断裂处是否应该减少凹痕?所以只有一个标签而不是两个?

编辑

Edit2所以在这里,我试着写我脑海中发生的事情,阅读这个伪代码:假设我有列表(5,3,8,7,2,4,1,6)。我将写|来将手与甲板分开,我还将写5_来强调我正在看的元素。所以我们开始吧:

i = 1, (5|3,8,7,2,4,1,6)
i = 2, (5,3|8,7,2,4,1,6), now j in {2}, so we only have j = 2, a(j=2)=3 < a(j=1)=5, hence swap 3 with 5
i = 3, (3,5,8|7,2,4,1,6), j in {2,3}, so j=2 gives a(j=2)=5 !< a(j=1)=3 SO WE BREAK!
i = 4, (3,5,8,7|2,4,1,6), j in {2,3,4}, so j = 2 gives a(j=2)=5 !< a(j=1)=3, SO WE BREAK

正如你所看到的,从现在开始,这将永远发生,因为我们从2开始,因为我们打破了它!所以即使j的整数集增加,我们也不能再增加2,因为我们违反了条件

共有2个答案

尉迟远
2023-03-14

第二行不是错误,因为您试图获取第i个元素(在外部循环上运行)并在其前面插入分区。然后,您必须将该元素与之前的分区进行比较,以便对其进行排序。

这个SO帖子有一个很好的可视化:插入排序与选择排序

湛光明
2023-03-14

如果您做出以下假设,则代码有效:

  • 长度N的数组具有索引1。。N
  • For循环覆盖指定范围,无论方向如何;因此,{a,…,b}中x的将通过a,a1,a2。。。,b-1,如果a

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

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

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

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

  • 本文向大家介绍JAVA堆排序算法的讲解,包括了JAVA堆排序算法的讲解的使用技巧和注意事项,需要的朋友参考一下 预备知识 堆排序   堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。 堆   堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个

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