美文网首页
java数据结构之希尔排序

java数据结构之希尔排序

作者: Cholechow | 来源:发表于2018-12-14 21:12 被阅读0次

希尔排序(Shell's Sort) 是插入排序的一种又称 “缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

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

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。

但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

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

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

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

稳定性

由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以 shell 排序是不稳定的。

排序过程

缩小增量

希尔排序属于插入类排序, 是将整个有序序列分割成若干小的子序列分别进行插入排序

排序过程:先取一个正整数 d1数组元素放一组,组内进行直接插入排序;然后取 d2

三趟结果

04 13 27 38 49 49 55 65 76 97

希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比 o(n^2) 好一些。

java代码如下:

package 数据结构;

public class Xierpaixu {

public static void sort(int arr []){

int h=1;

while(h<arr.length-1){

h=h*3+1;//h不断变化,间隔不断变大,找到最大的间隔,开始排序

}

while(h>0){

int temp=0;

for(int i=h;i<arr.length;i++){

temp=arr[i];

int j=i;

while(j>h-1&&arr[j-h]>=temp){

arr[j]=arr[j-h];

j-=h;

}

arr[j]=temp;

}

h=(h-1)/3;

}

}

}

测试:

package 数据结构;

public class TextXierpaixu {

public static void main(String args[]){

  int arr[]={2,5,4,15,54,34,21,43,22,67,76,78,33,61};

  Xierpaixu.sort(arr);

  for(int i=0;i<arr.length-1;i++){

  System.out.println(arr[i]);

  }

}}

输出结果如下:

好啦,这次就到这里啦,有问题可以和我留言哦!

邮箱:2321591758@qq.com

其他博客的链接:

Github个人网站 知乎 简书

欢迎各位访问哦,这次就到这里啦!

相关文章

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • java数据结构之希尔排序

    希尔排序(Shell's Sort) 是插入排序的一种又称 “缩小增量排序”(Diminishing Increm...

  • 021-数据结构与算法-排序

    基础方法或者数据结构的定义: 冒泡排序 选择排序 插入排序 希尔排序 希尔排序思想: 希尔排序是把记录按下标的一定...

  • 排序算法(四) 希尔排序(插入排序的进化)

    参考Java排序算法(四):希尔排序常见排序算法 - 希尔排序 (Shell Sort) 希尔排序算法是按其设计者...

  • 排序算法(二)之希尔排序

    图解排序算法(二)之希尔排序 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也...

  • (306)排序-java实现的选择/插入/希尔排序

    引言 用java实现的选择排序、插入排序、希尔排序。 代码(java) 运行结果

  • Python 算法大全

    这个库涵盖了多种算法和数据结构的介绍,比如: 排序算法(冒泡排序、希尔排序、插入排序、桶排序、合并排序、快速排序、...

  • C语言:关于数据的几种排序算法

    数据结构的排序算法有很多种。其中,快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法;基数排序、冒泡排序、...

  • 常见排序的java实现

    常见排序的java实现 常见排序java实现 插入排序(二分插入排序) 希尔排序 快速排序(三数中值快排) 冒泡排...

  • java希尔排序

    什么是希尔排序,可以参考这篇文章:希尔排序原理,图文并茂,通俗易懂 发现自己写了个错的希尔排序。。。 这里一不小心...

网友评论

      本文标题:java数据结构之希尔排序

      本文链接:https://www.haomeiwen.com/subject/jisnhqtx.html