试图理解贝壳排序

Trying to understand a shell sort

本文关键字:贝壳 排序      更新时间:2023-10-16

我试图理解我在网上找到的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。但我并不真正理解代码的其余部分。

首先,阅读插入排序。

最里面的循环执行插入排序的一部分,将元素插入到起点"左侧"的(大概(排序子数组中,但只考虑interval倍数的元素。第二个循环(for(i=...(执行插入排序的另一半,在数组中前进;当这个循环结束时,整个数组被排序,但只是在某种意义上,没有由interval倍数分隔的无序元素。也就是说,没有ik使得数组[i]>数组[i+k*间隔]。

最外层的循环遍历越来越小的间隔,直到它对整个数组进行"完整"插入排序。

我想从大间隔开始的想法是通过允许非常大或非常小的元素"跳过"数组的大部分而不是爬过每个位置来加快整个排序的速度; 这有多好并不明显......