我正在尝试理解我在网上找到的shell排序。这是代码:
for(increment = size/2;increment > 0; increment /= 2)
{
for(i = increment; i<size; i++)
{
temp = array[i];
for(j = i; j >= increment ;j-=increment)
{
//perform the insertion sort for this section
if(temp < array[j-increment])
{
array[j] = array[j-increment];
}
else
{
break;
}
}
array[j] = temp;
}
}
据我所知,第一个循环会将数组中的元素数除以2,直到达到1.但我并不完全理解代码的其余部分。
答案 0 :(得分:0)
首先,阅读insertion sort。
最里面的循环执行插入排序的一部分,将元素插入(可能)排序的子阵列&#34;到左边&#34;起点,但只考虑元素interval
的倍数。第二个循环(for(i=...
)执行插入排序的另一半,通过数组前进;当这个循环结束时,整个数组都会被排序,但只是在没有按顺序排列的interval
倍数的意义上。也就是说,没有i
和k
这样的数组[i]&gt;阵列[I + K *间隔。
最外层循环迭代越来越小的间隔,直到它完成一个&#34; full&#34;插入排序整个数组。
我认为以较大间隔开始的想法是通过允许非常大或非常小的元素来超越整个排序&#34;跳过&#34;阵列的大部分而不是遍历每个位置;它的工作原理并不是很明显......