• 希尔排序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

  • 相关阅读:
    【PMP】商业论证与效益管理文件
    【PMP】项目生命周期和开发生命周期
    【PMP】组织级项目管理(OPM)和战略
    【PMP】项目和运营的区别
    【PMP】项目、项目集、项目组合
    【PMP】项目的定义和特点
    c++ 调用模板函数时加template什么意思?
    散列表
    Windows消息机制详解
    python 获取当前目录下文件(转)
  • 原文地址:https://www.cnblogs.com/lbrs/p/11892877.html
Copyright © 2020-2023  润新知