简单排序算法实现——希尔排序

来源:互联网 发布:centos apache 配置 编辑:程序博客网 时间:2024/06/06 03:27

希尔排序也称递减增量排序算法,是在插入排序的基础上得到的高速稳定的排序算法,是最早冲破二次时间屏障的排序算法之一。

希尔排序使用一个增量数列:h1, h2, …… ht, 要求h1=1。(该要求的存在使得希尔排序在最后一次h1=1的时候实质上进行了普通插入排序)。

在每一趟中,使用当前的增量hk,对假象的每隔hk个元素的一个序列进行一次插入排序,一趟完成后对于每个i我们都有a[i]<=a[i+hk]:即所有相隔hk

的元素都被排序。称此时的数据是hk排序的。

希尔排序依赖的一个重要特性是:已经满足hk排序的文件将保持其hk排序性(证明暂不清楚)。否则的话前面各躺的排序成果会被后面的排序

给打乱。


增量序列的选择将对希尔排序的性能有重大影响, 虽然理论上只要最终步长为1的任何序列都可以完成工作。

流行且易于实现的序列是Shell建议的序列(称作Shell增量数列):ht=floor(N/2)和hk=floor(hk+1/2), 即初步长为数据长度的一半,之后对半递减。


已知最好的步长序列是由Marcin Ciura设计的(1,4,10,23,57,132,301,701,1750……)。表明在希尔操作中最重要的操作是比较,而不是交换。

该补偿序列比插入排序和堆排序都快,在小数组中比快速排序快,但是涉及大量数据是依然比快速排序慢。


时间复杂度依据增量序列不同而不同。

已知最好的最差时间复杂度为:O(n*(log(n)^2))

最优时间复杂度为O(n);


附图一张:



JAVA实现代码:

public class ShellSort{public static <AnyType extends Comparable<? super AnyType>>void ShellSort(AnyType[] a){int j;for(int gap=a.length/2;gap>0;gap/=2) //采用Shell序列:ht=floor(N/2)和hk=floor(hk+1/2)for(int i=gap;i<a.length;i++){AnyType temp=a[i];for(j=i;j>=gap&&temp.compareTo(a[j-gap])<0;j-=gap)//插入排序特征鲜明的挪位操作,此处是以gap为间隔挪位。a[j]=a[j-gap];a[j]=temp;//挪位完成后在正确的位置进行了插入。}}public static void main(String[] args){System.out.println("Shell Sort:");Integer[] elements={3,4,1,8,10,2,0,6,5};System.out.print("Original elements: ");for(int i=0;i<elements.length;i++) System.out.print(elements[i]+" ");System.out.println();ShellSort(elements);System.out.print("After sorting: ");for(int i=0;i<elements.length;i++) System.out.print(elements[i]+" ");System.out.println();}}



原创粉丝点击