Java 希尔排序(Shell Sort)

来源:互联网 发布:旅行包 知乎 编辑:程序博客网 时间:2024/06/10 21:45

    • 含义
    • 算法描述

含义

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

算法描述

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

希尔排序的时间复杂度与增量序列的选取有关,例如希尔增量时间复杂度为O(n^2),而Hibbard增量的希尔排序的时间复杂度为O(N^(5/4)),但是现今仍然没有人能找出希尔排序的精确下界。

public class ShellSort {    //希尔排序算法入口    public int[] shellSort(int[] Arr) {        //检查参数合法性       if(Arr == null || Arr.length<2)            return Arr;        // 初始化步长        int feet = Arr.length >> 1;        return sort(Arr,feet);    }    // 希尔排序算法具体实现方法(地柜方式)    public int[] sort(int[] Arr,int feet){        // 不长小于1就退出,因为步长为1时排序完成了        if(feet < 1)            return Arr;        for(int i = feet; i< Arr.length; i++){            int index = i;            // 将当前位置的数据放置到合适的位置            while(index>=feet){                if(Arr[index]<Arr[index-feet]){                    swap(Arr,index,index-feet);                }else{                    break;                }                index -= feet;            }        }        // 递归调用排序方法,每次递归,步长减少一半        return sort(Arr,feet>>1);    }    public void swap(int[] Arr,int index1,int index2){        int temp = Arr[index1];        Arr[index1] = Arr[index2];        Arr[index2] = temp;    }}

理论知识参考链接
13种排序算法
百度百科之希尔排序

1 0
原创粉丝点击