【插入排序】希尔排序--Java

来源:互联网 发布:什么是物联网大数据 编辑:程序博客网 时间:2024/06/11 00:04

希尔排序是一种分组插入方法,其思想是:

1、取订一个整数d1作为第一个增量,把表的记录分为d1个组,所有距离为d1的倍数的记录在同一小组,在各组内进行直接插入排序

2、取第二个增量d2(<d1),重复上述的分组和排序

3、直至所取的增量d=1,即所有记录放在同一组中进行直接插入排序。


例如:设要排序的的表有十个记录,其关键字分别为{3,6,4,7,9,8,1,5,2,0},其排序过程为:












解:

第一趟排序时,d=5,整个表被分成5组:(3,8),(6,1),(4,5),(7,2),(9,0),各组采用直接插入排序变成有序的,结果为(3,6,4,2,0,8,1,5,7,9)。

第二趟排序时,d=2,整个表被分成2组:(3,4,0,1,7),(6,2,8,5,0),各组采用直接插入排序变成有序的,结果为(1,0,2,5,3,6,4,7,9)。

第三趟排序时,d=1,整个表被分为1组:(1,0,2,5,3,6,4,7,9),采用直接插入排序变成有序的,结果为:(0,1,2,3,4,5,6,7,8,9)


代码1如下(运行成功):

public class ShellSort {public static void main(String[] args){int[] array={3,6,4,7,9,8,1,5,2,0};int d=array.length/2;while(d>0){for(int i=d;i<array.length;i++){int tmp=array[i];int j=i-d;while(j>=0 && array[j]>tmp){array[j+d]=array[j];j=j-d;}array[j+d]=tmp;}d=d/2;}for(int i=0;i<array.length;i++){System.out.print(array[i]+"\t");}}}
代码2如下(运行成功):

public class ShellSort {public static void main(String[] args){int[] array={3,6,4,7,9,8,1,5,2,0};int d=array.length/2;while(d>0){for(int i=d;i<array.length;i++){int tmp=array[i];int j=i-d;while(j>=0 && array[j]>tmp){array[j+d]=array[j];j=j-d;}array[j+d]=tmp;}d=d/2;}for(int i=0;i<array.length;i++){System.out.print(array[i]+"\t");}}}

希尔算法的时间复杂度难以分析,一般认为其平均时间复杂度均为O(n^1.3)。希尔排序的速度通常要比直接插入排序快。辅助空间复杂度为O(1)。另外,希尔排序是一种不稳定的排序方法。

0 0
原创粉丝点击