简单排序算法实现——希尔排序
来源:互联网 发布: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();}}
- 简单排序算法实现——希尔排序
- java实现简单排序算法:希尔排序
- 排序算法—希尔排序算法分析与实现(Python)
- 希尔排序简单实现
- 实现希尔排序算法。
- Java实现排序算法——希尔排序
- 算法——希尔排序
- 算法 —— 希尔排序
- 算法——希尔排序
- java算法—希尔排序
- 简单排序——希尔排序
- 算法排序———希尔排序
- 排序算法——希尔排序
- 经典算法排序——希尔排序
- 排序算法4——希尔排序
- 排序算法——希尔排序
- 排序算法——希尔排序
- 排序算法——希尔排序
- Real编解码
- 如何从DLL中生成LIB文件
- 高级排序
- js 加载 goole map
- WebStorm 5.0.4支持Jade模板
- 简单排序算法实现——希尔排序
- TFTP/NFS/Samba
- PL-SQL Developer 整合SVN Pluglns
- Java虚拟机方法区
- SP报错内容:此查询使用不支持的元素,例如引用多个列表,或使用 EntityRef/EntitySet 投影完整实体
- 5.1.6. Server Status Variables
- C++动态加载 DLL
- ubuntu12.04中安装lamp
- solr 4.1入门官方文档