常用排序算法-希尔排序
简介
希尔排序算法是插入排序算法的一种,又叫做缩小增量排序算法,是插入排序算法的一种更高效的改进版本,是非稳定排序。希尔排序算法将数据序列按下标的一定增量进行分组,对每组使用插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
原理
希尔排序算法的具体做法为:假设待排序元素序列有N个元素,取一个小于N的整数增量值incremen作为间隔,将全部元素分为increment个子序列,将所有距离为increment的元素放在一个序列中,并对每一个序列执行直接插入排序。然后缩小increment,重复上述划分子序列和排序的过程,直到最后increment为1,再执行一次直接插入排序,此时序列已经有序,算法终止。
由于increment开始取的值较大,但每个子序列中的元素较少,排序速度较快。到了排序后期,increment值逐渐变小,子序列中元素逐渐增多,但由于前面的工作使得整个序列大部分元素都是有序的,减少了元素移动的次数,排序仍然是较快的。
程序
public class ShellSort { public static void sort(int[] arr){ int dk = arr.length / 2; while(dk > 0){ shellSort(arr, dk); dk = dk / 2; } } public static void shellSort(int[] arr, int dk){ for(int i = dk; i < arr.length; ++i){ int index = i - dk; int insertNum = arr[i]; while(index >= 0 && arr[index] > insertNum){ arr[index + dk] = arr[index]; index -= dk; } arr[index + dk] = insertNum; } } }
总结
希尔排序的时间复杂度最差为O(n^2),最好情况时O(n),平均时间复杂度为O(n^1.3)。
希尔排序空间复杂度O(1)。
由于希尔排序会将元素分组再执行插入排序,组内排序后会改变元素在整个数组的顺序,所以希尔排序是不稳定的。