排序——希尔排序

来源:互联网 发布:平面设计软件知乎 编辑:程序博客网 时间:2024/06/06 02:33
尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
希尔排序是不稳定排序。
基本思想
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量
  
=1(
  
<
  
…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
示例:
有一个序列:4、9、7、1、3、8、2、0
取增量为序列长度的一半即4,将序列分为4个子序列A,B,C,D;如图


将四个序列分别排序,后序列如下
3、8、20、49、7、1
再取增量为4的一半即2,将序列分为两个序列A,B

将两个序列分别排序后序列
2、03、1、48、7、9
再取增量为2的一半即1,将整个序列进行一次排序的到最终排序结果
0、1、23、47、8、9
Java代码实现:
 public static void shellSort(int[] data) { //len 为数组长度 int len = data.length; //g增量  初始增量为数组长度的一半 for(int g = len/2;g>0;g/=2) { for(int i=g;i<len;i++){ //临时保存当前的值 int tmp =data[i]; int j = i-g; //如果当前值小 则和所在序列中前面的所有值进行比较,最总确定当前值在序列中的正确位置 while(j>=0&&data[j] > tmp) { data[j+g]=data[j]; j-=g; } data[j+g]=tmp; } } }


0 0
原创粉丝点击