之前我问过这个问题,但我的帖子里堆满了一大堆其他代码而且没有清楚呈现,所以我要再试一次。对不起,我是新来的
Shell排序,我是如何编写的,有时只能起作用。数组a
是一个100个整数未排序的数组,inc
是一个包含4个整数的数组,其值是shell排序应该使用的区间(它们下降,最终值始终为1),{{1这是一个存储不同shell排序运行计数的数组,count
表示应该为这次shell排序运行更新的计数值。
当我多次运行shell排序时,使用不同的4个时间间隔,有时只能完全排序。数组完全排序的时间的一半,数组部分排序的另一半时间。
有人可以帮忙吗?提前谢谢!
cnt
答案 0 :(得分:1)
一个问题是,您只为每个inc[k]
排序一个k
- 步骤序列,而您应该对它们进行排序(您只是排序{a[0], a[s], a[2*s], ... , a[m*s]}
,而忽略{ {1}}等。但是,这应该只影响性能(操作次数),而不是结果,因为最后一次传递是经典的插入排序({a[1], a[s+1], ... , a[m*s+1]}
),因此无论以前发生什么,都应对数组进行排序。
我在代码中看不到会导致失败的任何内容。也许inc[inc.length-1] == 1
数组不包含它应该包含的内容?如果在外循环的每次迭代中打印出inc
,你会得到预期的输出吗?
答案 1 :(得分:0)
i
循环控件出错:
for (int i = inc[k], j; i < a.length; i += inc[k]) {
应该是:
for (int i = inc[k], j; i < a.length; i++) {
内部j
循环处理inc[k]
分开的元素的比较。外部i
循环应该简单地递增1,与标准插入排序的外部循环相同。
事实上,Shellsort的最终传递增量为1,与标准的Insertion排序相同。