我的回答是:
Shell 排序进行冗余比较,因为如果在比较相距很远的元素时(当 h
大约在 8
时),它比较两个将成为邻居的元素,然后在比较彼此靠近的元素时(当 h
大约为 1
时)将再次比较相同的元素。例如,如果列表是 113 400 818 612 112 311 412 429
,当 h = 4
时,它将比较 113
和 112
,当 h = 1
时,它将再次比较 113
和 112
,因为它将比较彼此最接近的元素.
我的回答正确吗?
最佳答案
您的示例绝对是发生冗余的示例。事实上,在 Shell 排序中,冗余是不可避免的。正如您所注意到的,当 h = 1 时,它总是比较在之前的预处理中已经比较过的东西。要提高 Shell 排序的性能(即减少冗余比较),您可以做的一件事是巧妙地选择 h。例如,如果选择h为4、2、1,那么113和112要进行3次比较,而如果选择h为5、3、1,则冗余比较明显减少。选择 h 的一般规则是不要选择 2 的幂,也不要选择彼此的倍数。希望这会有所帮助。
关于algorithm - shell排序什么时候进行冗余比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7642132/