Shell Sort:不能使用某些间隔组合

时间:2011-12-09 17:30:20

标签: java algorithm sorting shellsort

之前我问过这个问题,但我的帖子里堆满了一大堆其他代码而且没有清楚呈现,所以我要再试一次。对不起,我是新来的

Shell排序,我是如何编写的,有时只能起作用。数组a是一个100个整数未排序的数组,inc是一个包含4个整数的数组,其值是shell排序应该使用的区间(它们下降,最终值始终为1),{{1这是一个存储不同shell排序运行计数的数组,count表示应该为这次shell排序运行更新的计数值。

当我多次运行shell排序时,使用不同的4个时间间隔,有时只能完全排序。数组完全排序的时间的一半,数组部分排序的另一半时间。

有人可以帮忙吗?提前谢谢!

cnt

2 个答案:

答案 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排序相同。