【排序】7.希尔排序
插入排序的一种,也叫缩小增量排序,是直接插入排序算法的改进版本,是一种分组插入方法
排序思路:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;
随着增量的逐渐减少,每组关键字越来越多,当增量减到1时,文件恰好被分为一组,算法终止
希尔排序是基于插入排序的以下两点性质进行改进的:
插入排序在对几乎已经排好序的数据操作时,效率高
一般来说是低效的,因为只能移动一位
public static void shellsort(int[] a){ if (a==null&&a.length==0) { return; } int d=a.length; //算法效率排行: 移位 > 赋值 > 大小比较 > 加法 > 减法 > 乘法 > 取模 > 除法 //不建议这么做 /* 这是一个微优化,一般的优化器都可以做到。手动优化纯属得不偿失,甚至反而有可能损失性能。 * 这个优化带来的效率提升是微乎其微的,甚至没有任何影响。在这里浪费时间还不如好好优化别的地方。 * 代码的效率应该放到次要的位置(除非是性能瓶颈),良好的设计什么的才是更重要的选择。 * 影响可读性。把 x = 5 * x + 1 写成 x += x << 2 + 1 的对读代码的人不友好*/ while(d>=1){ d=d>>1;//向低位移一位,当被除数大于0时,相当于除2,效率更高 insertsort(a,d); //子数组进行插入排序 } } public static void insertsort(int[] a,int d){//对子数组的排序可以替换为其他排序 for (int i = 0; i < d; i++) { for (int j = i+d; j < a.length; j=j+d) { int temp=a[j]; int k; for (k = j-d;k>=0&&a[k]<temp; k=k-d) { a[k+d]=a[k]; } a[k+d]=temp; } } }
希尔排序是一种不稳定的排序方法
希尔排序的时间复杂度与增量序列的选取有关
时间复杂度:希尔增量时间复杂度为O(n²)
Hibbard增量的时间复杂度为O(
)
空间复杂度:O(1)
希尔排序时间复杂度的下界是O(n*log2n),比快速排序要慢
中等规模的数据表现好,不适合太大规模的数据排序

浙公网安备 33010602011771号