希尔排序Shell_Sort

概述:听到希尔排序这个名称,心里完全没有任何概念,因为这个名称不能给你提供任何有效的信息。但是它的名字又是那么的特殊,以至于学习过数据结构排序的都知道这种方法的存在。现在我们就来看一下所谓的希尔排序。

希尔排序是一种先进排序的算法,先进排序算法是指时间复杂度比简单排序更进一步的排序算法,除希尔排序之外,还有归并排序,快速排序,堆排序等。它的思想来源于插入排序,只不过是把数组分为若干组分别进行排序。

例如一个数组{49,38,65,97,76,13,27,55,4},首先设置一个增量序列数组{3,2,1},第一步设置gap为3,将数组分为3组,分别是{49,97,27},{38,76,55},{65,13,4},然后分别做插入排序,变为{27,49,97},{38,55,76},{4,13,65},然后再把它们组合起来,变为{27,38,4,49,55,13,97,76,65}。如下所示相同颜色为一组,每组分别进行排序【指插入排序】,然后形成一次排序,图中下面的数据即是一次排序的结果。接着gap改成数组中的第二个元素2,即分为2组,分别是{27,4,55,97,65}和{38,49,13,76},最后进行gap设置为1进行排序,形成有序数组。

 

 

时间复杂度:关于希尔排序的时间复杂是一个复杂的问题,它与选取的增量序列数组有关,但是现在尚未有人能够给出一种最好的增量序列方法,涉及到一些数学上尚未解决的难题。

 

如何选取增量序列:可以有各种取法,但应使增量序列中的值没有除1以外的公因子,并且最后一个增量值应为1.

 

代码:

 

 

public class Shell_Sort {

    static void insertion(int [] a, int d)
    {
        for(int l = 0; l < d; l++) {
            for (int i = d+l; i < a.length; i += d) {
                int sen = a[i];
                int j = i - d;
                for (; j >= 0; j -= d) {
                    if (a[j] > sen)
                        a[j + d] = a[j];
                    else {
                        break;
                    }
                }
                a[j + d] = sen;

            }
        }
        for (int n:a)
            System.out.print(n+" ");
        System.out.println();

    }

    public static void main(String []args)
    {
        int [] d = {3,2,1};
        int [] a = {49,38,65,97,76,13,27,55,4};
        for (int k = 0; k < d.length; k++)
        {
            insertion(a,d[k]);
        }
    }

}

 

结果:

27 38 4 49 55 13 97 76 65
4 13 27 38 55 49 65 76 97
4 13 27 38 49 55 65 76 97

 

 

 

 

posted @ 2019-11-19 22:14  LeftBody  阅读(125)  评论(0编辑  收藏  举报