博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构——希尔排序(使用Java)
阅读量:5807 次
发布时间:2019-06-18

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

 一、简介

  希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。而该排序法直接以发明者命名。其排序的原理有点像插入排序,但他可以减少数据搬运的次数。排序的原则是将数据区分割成特定间隔的几个小块,以插入排序法排完区域块内的数据后再渐渐减少间隔距离

 二、核心思想

  希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

  

  先取一个小于n的整数d1作为第一个 ,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行 ;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量
=1(
<
…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

 

该方法实质上是一种分组插入方法

 

  比较相隔较远距离(称为 )的数,使得数移动时能跨过多个元素,则进行一次比
[2]   较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的 中实现了这一思想。算法先将要排序的一组数按某个 d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当 减到1时,整个要排序的数被分成一组,排序完成。

 

一般的初次取序列的一半为 ,以后每次减半,直到增量为1。
 

 三、实例说明

 

四、核心代码

 

1 private static void Shell(int[] a) { 2          int n=a.length;//数组长度 3          int jemp=n/2;//增量,用来记录间隔位移量 4          int temp=0;//用来交换数据 5          while(jemp!=0){
//将增量逐渐缩小到间隔位移量为1 6 for (int i = jemp; i < n; i++) { 7 temp=a[i]; 8 int j=i-jemp; 9 while (j>=0&&a[j]>temp) {
//使用插入排序方法进行交换10 a[j+jemp]=a[j];11 j=j-jemp;12 }13 a[j+jemp]=temp;14 }15 jemp=jemp/2;//控制循环数16 }17 } 18 public static void main(String[] args) {19 int[]a=new int[10];20 Random ran=new Random();21 System.out.println("排序前数组");22 //使用Random方法生成一个随机数组并输出23 for (int i = 0; i < a.length; i++) {24 a[i]=ran.nextInt(100);25 System.out.print(a[i]+" ");26 }27 //调用排序方法28 Shell(a);29 //输出排序后方法30 System.out.println("排序后数组");31 for (int i = 0; i < a.length; i++) {32 33 System.out.print(a[i]+" ");34 }35 }
View Code

 五、算法分析  

  1. 任何情况下时间复杂度均为O(n3/2)。
  2. 希尔排序和插入排序均是稳定排序。
  3. 只需一个额外空间,所以空间复杂度是最佳的。
  4. 此算法适用于数据大部分都已经排完的情况

转载于:https://www.cnblogs.com/TYDBLOG/p/7688430.html

你可能感兴趣的文章
面试vue组件间事件派发与接收
查看>>
以太坊、EOS和Hyperledger等区块链的不同
查看>>
DUBBO与ZOOKEEPER、SPRINGMVC整合和使用
查看>>
深入 LevelDB 数据文件 SSTable 的结构
查看>>
WWDC 2018:在Swift中如何高效地使用集合
查看>>
妈妈再也不用担心我的面试了 之 js原型和原型链
查看>>
Base64 的原理、实现及应用
查看>>
『Ansible 上手指南:2』
查看>>
Android FrameWork学习(一)Android 7 0系统源码下载 编译
查看>>
学java就两个问题
查看>>
视频开发基础篇
查看>>
初探 JavaScript 的变量
查看>>
javaScript高阶级函数
查看>>
webpack系列-插件机制杂记
查看>>
Android技术栈总结
查看>>
18年总结
查看>>
【收藏干货】axios配置大全
查看>>
如何快速学习Java?
查看>>
91. Decode Ways
查看>>
219. Contains Duplicate II
查看>>