博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序之希尔排序
阅读量:5163 次
发布时间:2019-06-13

本文共 1586 字,大约阅读时间需要 5 分钟。

从刚开始本科学习数据结构的时候,对希尔排序就一直稀里糊涂的,弄不清到底怎么回事,重温知识,对此才稍加了解,希尔排序就是插入排序,不过它对插入排序进行了一些优化,我们之道,插入排序的性能与初始序列的排序状况有关,假设需要的排序效果是从小到达,如果给定的序列原本就是有序的,那么排序的时候只需遍历一遍数组就可以了;但是,如果给定的序列原本是逆序的,必须 5 4 3 2 1,那么对数组的中的数据(注意,这里是数据,而非数组)扫描的次数大约是(5+4+3+2+1)次,也就是说如果给定n个数据,排序的时间复杂度是O(n^2),所以,插入排序对于具有“良好有序性”的序列(也就是说序列不是逆序的)来说,其排序效果还是不错的;但是对于纯逆序的序列来说,排序效果就不是那么好了,这时候,希尔排序的优化效果就体现出来了,它的思想是这样的:先对局部序列进行数次插入排序,这样可以使整体序列趋于有序,最后对整体序列进行插入排序,就可以得到有序的序列。下面用一张图进行说明:

图中,相同颜色的数据组成一个子序列,子序列进行插入排序。这里增量step采用减半的形式求解,也就是对于长度为10的序列,step的取值为5、2、1,从图中可以看出,当step=1的时候,是对整个序列进行插入排序,这时候整个序列已经“整体有序”,所以利用插入排序对数据的访问此次不回很多。具体代码如下:

public class Test{    public static void main(String[] args)throws InterruptedException{        int[] array={32,56,34,23,43,45,23,54,56,31,322};        printArray(array);        int temp=0,x=0,i=0,j=0;        int step=array.length;        while(true){            step=step/2;                        for(x=0;x
=0 && array[j]>temp;j-=step){ array[j+step]=array[j]; } array[j+step]=temp; } } if(step==1){ break; } } printArray(array); } static void printArray(int[] array){ for(int val:array){ System.out.print(val+" "); } System.out.println(); }}

算法分析:希尔排序是一种不稳定的算法,单纯的插入排序是稳定的,希尔排序的空间复杂度为O(1),但是其时间复杂度:平均情况O(n^1.3)、最好情况O(n)、最坏情况难说,人们发明很多递增序列(也就是step取值)来渐进改进最坏情况下的比较次数(n^4/3,n^5/4,n^6/5......),这也说明,一个算法的出现,一定会有相应的优化策略。希尔排序和插入排序一样,同属初级排序算法。

 

转载于:https://www.cnblogs.com/codeMedita/p/7424109.html

你可能感兴趣的文章
面试经验[all]
查看>>
算法笔记
查看>>
6 行为型模式之 - 命令模式
查看>>
Mvc ModelState.isValid为false时,检查时那个字段不符合规则的代码
查看>>
Python 之 基础知识(三)
查看>>
cluster集群
查看>>
搞JAVA在北京月薪15K的朋友来到厦门却很难找到工作
查看>>
冒泡数组排序
查看>>
kibana5画图
查看>>
类的加载和反射
查看>>
Linux学习笔记四
查看>>
JavaScript
查看>>
[转]getHibernateTemplate出现的所有find方法的总结
查看>>
【转】HTTP中的长连接和短连接分析
查看>>
scala 基本语法
查看>>
2019.08.02 学习整理
查看>>
JavaScript面向对象基础语法总结
查看>>
页面输入模糊数据---异步后台查询
查看>>
Java基础入门(二)
查看>>
Numpy数组
查看>>