一、算法简介
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
二、算法描述
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)),但是现今仍然没有人能找出希尔排序的精确下界。
最差时间复杂度 | O(n log n) |
最优时间复杂度 | O(n) |
最差空间复杂度 | 需要额外辅助空间O(n) |
三、图解算法
四、示例代码
public class ShellSort { public int[] shellSort(int[] A, int n) { // write code here if(A==null || n<2) return A; int feet = n/2; int index = 0; while(feet > 0){ for(int i=feet; i<n; i++){ index = i; while(index >= feet){ if(A[index-feet] > A[index]){ swap(A,index-feet,index); index-=feet; }else{ break; } } } feet = feet/2; } return A; } void swap(int[] A,int m,int n){ int temp = A[m]; A[m] = A[n]; A[n] = temp; } }