一、Shell排序算法原理
希尔排序(Shell Sort)是 DLShell 于1959 年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是 O(n2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。
直接插入排序,应该说,它的效率在某些时候是很高的,比如,我们的记录本身就是基本有序的,我们只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效.还有就是记录数比较少时,直接插入的优势也比较明显,可问题在于,两个条件本身就过于苛刻,现实中记录少或者基本有序都属于特殊情况,科学家希尔研究出了一种排序方法,即对直接插入排序改进后可以增加排序算法的效率.。
如何让待排序的记录个数较少呢?很容易想到的就是将原本有大量记录数的记录进行分组,分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时(注意只是基本有序时),再对全体记录进行一次直接插入排序(所谓的基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间
)。我们需要采取跳跃分割的策略,将相距某个"增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不 是局部有序。
具体实现步骤如下:
(1)假设输入数据表为{9,1,5,8,3,7,4,6,2},即输入的表长为length=9,此时,增量为变量increment,在经过第一次do...while循环(increment<=1时终止)后,改变增量increment的值(如:increment=9/3+1=4)。之后进入for循环,第一层for循环根据增量情况进行变化(如:i=increment;i<length;i++),此时,如果arr[i]>arr[i-increment],则将arr[i]与arr[j]进行交换,之后进入第二层for循环