根据Robert Sedwick的说法,shell排序(应该比插入排序运行得更快)试图通过不同的h排序来最小化反转距离。 在某种程度上,这种h分类过程使文件几乎排序,从而以更对称的方式重新排列反转分布。
然后如何说(根据书中),插入排序运行时间取决于反转的数量&不是他们的分配方式?
答案 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)当然是棘手的部分!