为什么反转的分布在插入排序中不重要?

时间:2013-08-18 05:51:46

标签: sorting insertion-sort inversion shellsort

根据Robert Sedwick的说法,shell排序(应该比插入排序运行得更快)试图通过不同的h排序来最小化反转距离。   在某种程度上,这种h分类过程使文件几乎排序,从而以更对称的方式重新排列反转分布。

然后如何说(根据书中),插入排序运行时间取决于反转的数量&不是他们的分配方式?

2 个答案:

答案 0 :(得分:1)

在插入排序中,每次进行的交换都会将反转次数减少一个。例如,想象一下,我们要在插入排序中交换两个相邻的元素B和A.在交换之前,数组看起来像这样:

   +--------------+---+---+------------+
   |    before    | B | A |    after   |
   +--------------+---+---+------------+

然后,它看起来像这样:

   +--------------+---+---+------------+
   |    before    | A | B |    after   |
   +--------------+---+---+------------+

现在,考虑一下数组中的反转。任何反转纯粹在"之前"或"之后"还在那里。来自"之前的所有反转"进入"之后#34;仍然存在,以及"之前的#34;进入A,"之前"进入B,进入"之后,"和B进入"之后。"唯一的反转是特定的反转对(A,B)。因此,插入排序中的交换次数恰好等于反转次数,因为每次反转需要一次交换,并且算法在没有剩余反转时停止。请注意,它只是重要的反转总数,而不是它们的位置。

另一方面,对于shellsort,这是 true。假设在shellort中我们交换了元素B和A,这些元素不合适但不相邻。原则上,在交换之前我们有这样的事情:

   +--------------+---+----------+---+------------+
   |    before    | B |  middle  | A |    after   |
   +--------------+---+----------+---+------------+

我们以此结束:

   +--------------+---+----------+---+------------+
   |    before    | A |  middle  | B |    after   |
   +--------------+---+----------+---+------------+

倒置(B,A)现在已经消失,但是很有可能通过这一步消除了更多的倒置。例如,假设"中"中有一堆元素。那些小于B.然后单个交换将同时消除所有这些。

因为shellsort中的每次交换都可能消除多次反转,这些反转的实际位置确实对运行时而言非常重要,而不仅仅是它们的位置。

答案 1 :(得分:1)

本身不是答案:shell排序实际上确实平均需要的插入排序比插入排序少,并且可能所有其他排序算法提供为您提供正确的间隙序列反过来,它是n的函数(要排序的元素的数量)。每个n可能只有一个(唯一的)最佳间隙序列。

定义F(n)当然是棘手的部分!