希尔排序 - 数据结构与算法

硅谷探秘者 388 0 0
算法思想:

希尔排序是插入排序的增强版,其主要的算法思想还是插入排序的思想。

算法描述:

在插入排序的基础上,对待排序数组进行间隔为inc的分组,然后对每个分组进行直接插入排序,一次排序完成后,减小inc间隔,然后再进行分组,对每个分组进行直接插入排序。直到分组间隔小于等于1,算法结束。

public  class Test7{
        public static void main(String args[]){
                int a[]=new int[]{9,8},inc=a.length,temp;
                while(inc>1){
                        inc = (int) Math.ceil((double)(inc)/3l);
                        for(int i=inc;i<a.length;i++){
                                temp=a[i];
                                int j=i-inc;
                                while(j>=0&&a[j]>temp){
                                        a[j+inc]=a[j];
                                        j-=inc;
                                }
                                a[j+inc]=temp;
                        }
                }
                for(int i=0;i<a.length;i++){
                        System.out.print(a[i]+" ");
                }
                System.out.println();
                        
        }
}

时间复杂度:O(n2/3)

百度百科:

不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法, 在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间的时间复杂度为O(n2/3),希尔排序时间复杂度的下界是n*log2n。希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O()复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。专家们提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法是直接插入排序算法的一种改进,减少了其复制的次数,速度要快很多。 原因是,当n值很大时数据项每一趟排序需要移动的个数很少,但数据项的距离很长。当n值减小时每一趟需要移动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。Shell算法的性能与所选取的分组长度序列有很大关系。只对特定的待排序记录序列,可以准确地估算关键词的比较次数和对象移动次数。想要弄清关键词比较次数和记录移动次数与增量选择之间的关系,并给出完整的数学分析,今仍然是数学难题。

猜你喜欢
数据结构与算法 355 思想:把所有需要分成两个集合,一个是待集合,一个是已的集合,每次从未集合顺或随机拿取一个,把它加入到已集合使其有,直到未集合中的被取走完,
数据结构与算法 420 ,若组只有一个元素则无需操作。每次递归束时,左右两个组都是有的,然后对这两个中的进行,使整个组有。直到束。publicclassTest8{ publicstaticint
数据结构与算法 3896 (英语:Heapsort)是指利用堆这种所设计的一种。堆是一个近似完全二叉树的,并同时满足堆积的性质:即子点的键值或索引总是小于(或者大于)它的父节点。以最小堆为例下沉操
数据结构与算法 435 思想将待集合以该集合中随机的一个为分界点分成左右两个集合,一次使其右边的集合的全部大于左边的集合,然后再分别递归式的对左右两个集合执行上述操作,直到递归集合没有,递归束完
数据结构与算法 333 思想:每次从没有的集合a中拿取一个最大或最小的元素,放入有的集合b中,直到a集合中的元素被取完描述:用变量i遍历整个组,用变量j遍历i后面的组,每次交换i比j大的元素,使得i遍历过
数据结构与算法 536 思想把所有需要分成两个集合,一个是待集合,一个是已的集合,每次从未集合顺或随机拿取一个,把它加入到已集合使其有,直到未集合中的被取走完,束案例
数据结构与算法 547 原文链接:https://www.zhihu.com/question/23148377?sort=created基础 时间复杂度 空间复杂度基础 线性表 列表(必学) 链表(必学
数据结构与算法 417 思想:对冒泡的一种改进,每次从没有的集合a中拿取一个最大或最小的元素,放入有的集合b中,直到a集合中的元素被取完描述:用变量i遍历整个组,用变量j遍历i后面的组,每次遍历i初始
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议
目录
祝愿神州十三飞行乘组平安归来