最佳排序算法 - 部分排序链表

时间:2016-12-27 00:36:21

标签: algorithm sorting insertion-sort

  

问题 - 给定一个已排序的双向链接列表和两个数字C和K.您需要通过K减少数据C的节点信息,并插入形成在其正确位置的新节点列表仍然排序。

我会想到插入排序这样的问题,因为,在任何实例中的插入排序看起来像是一堆卡片,

enter image description here

部分排序。对于插入排序,交换次数等于反转次数。比较次数相当于交换次数+(N-1)。

因此,在给定的问题(上面)中,如果具有数据K的节点减少了C,则排序的链表变为部分排序。 插入排序最适合

另一点是,在选择排序算法的过程中,如果应用于数据的数组表示的排序逻辑最适合,那么相同的排序逻辑应该最适合相同数据的链表表示。

对于这个问题,我的思维过程在选择插入排序时是否正确?

2 个答案:

答案 0 :(得分:1)

也许你的意思是别的,但插入排序不是最好的算法,因为你实际上并不需要对任何东西进行排序。如果只有一个元素具有值K,那么它不会产生很大的差异,但是否则会产生很大的差异。

所以我建议使用以下算法O(n),为简单起见忽略边缘情况:

  1. 在列表中前进,直到当前节点的值为> K - C.
  2. 保存此节点,将在此节点之前插入所有缩减的节点。
  3. 继续前进,同时当前节点的值为< ķ
  4. 当前节点的值为K时,删除节点,将值设置为K-C并将其插入保存的节点之前。这可以进一步优化,因此您只需要删除并插入具有值K的整个节点子列表的操作。

答案 1 :(得分:1)

如果在排序列表必须可用之前可以批量处理这些减少操作,则只需从列表中删除所有递减的节点即可。然后,对它们进行排序,并在列表中执行双向合并。

如果在每个节点递减后必须按顺序维护列表,那么除了删除递减的节点并按顺序重新插入之外别无选择。

通过线性搜索一副牌来做这件事可能是可以接受的,除非你正在运行一些涉及卡片的蒙特卡罗模拟,这些模拟运行了几个小时或一天,因此优化很重要。

否则我们处理维护顺序需求的方式是使用有序序列数据结构:平衡二叉树(红黑,splay)或跳过列表。将节点从结构中取出,调整值,重新插入:O(log N)。