问题 - 给定一个已排序的双向链接列表和两个数字C和K.您需要通过
K
减少数据C
的节点信息,并插入形成在其正确位置的新节点列表仍然排序。
我会想到插入排序这样的问题,因为,在任何实例中的插入排序看起来像是一堆卡片,
部分排序。对于插入排序,交换次数等于反转次数。比较次数相当于交换次数+(N-1)。
因此,在给定的问题(上面)中,如果具有数据K的节点减少了C,则排序的链表变为部分排序。 插入排序最适合。
另一点是,在选择排序算法的过程中,如果应用于数据的数组表示的排序逻辑最适合,那么相同的排序逻辑应该最适合相同数据的链表表示。
对于这个问题,我的思维过程在选择插入排序时是否正确?
答案 0 :(得分:1)
也许你的意思是别的,但插入排序不是最好的算法,因为你实际上并不需要对任何东西进行排序。如果只有一个元素具有值K,那么它不会产生很大的差异,但是否则会产生很大的差异。
所以我建议使用以下算法O(n),为简单起见忽略边缘情况:
答案 1 :(得分:1)
如果在排序列表必须可用之前可以批量处理这些减少操作,则只需从列表中删除所有递减的节点即可。然后,对它们进行排序,并在列表中执行双向合并。
如果在每个节点递减后必须按顺序维护列表,那么除了删除递减的节点并按顺序重新插入之外别无选择。
通过线性搜索一副牌来做这件事可能是可以接受的,除非你正在运行一些涉及卡片的蒙特卡罗模拟,这些模拟运行了几个小时或一天,因此优化很重要。
否则我们处理维护顺序需求的方式是使用有序序列数据结构:平衡二叉树(红黑,splay)或跳过列表。将节点从结构中取出,调整值,重新插入:O(log N)。