希尔排序

来源:互联网 发布:linux修改时区不重启 编辑:程序博客网 时间:2024/06/05 08:44
算法描述:
希尔排序是插入排序的一种改良。在插入排序中,每次交换都是相邻的元素进行交换,如果一个很小的元素在数组的末尾,那么将它移动到数组的前面来需要很多次的交换,效率较低。
希尔排序的思想是使数组中任意间隔为h的元素是有序的。这样的数组被称为h有序数组。如果h很大,我们就能将元素移动到很远的地方,为实现更小的h有序创造方便。我们能够将数组排序,直至h为1。

算法实现:
class Shell
{
public:
    static bool sort(int *a, int iLength)
    {
        int h = 1;
        while(h < iLength / 3) h = h * 3 + 1;
        while(h >= 1)
        {
            /* 将数组变为h有序 */
            for(int i = h; i < iLength; i++)
            {
                for(int j = i; j >= h && a[j] < a[j - h]; j -= h)
                {
                    int temp = a[j];
                    a[j] = a[j - h];
                    a[j - h] = temp;
                }
            }
            h /= 3;
        }
    }
};
该算法中,我们制造了一个h序列:1,4,13,40,121...。然后将数组变成h有序,当数组为“1有序”的时候,排序完成。

时间复杂度:
算法的性能取决于h,还取决于h之间的数学性质,比如它们的公因子,很显然,公因子越少的h序列,该算法的性能越高。
该算法比插入排序和选择排序快很多,能解决插入排序无法解决的一些问题,比如说倒序数组的排序。但是数学上还不知道该算法所需要的平均比较次数。目前最重要的结论是“希尔排序的运行时间达不到平方级别”。

空间复杂度:
o(1)

稳定性:
希尔排序是不稳定的,因为该算法并不仅仅是相邻元素之间的比较和交换。

适用情景:
1、中等大小的数组,该算法的运行时间是可以接受的,代码量小,而且不需要额外的内存空间;
0 0
原创粉丝点击