【排序算法】希尔排序(java实现)

来源:互联网 发布:织梦 列表 ajax 排序 编辑:程序博客网 时间:2024/04/28 19:22

1.基本思想:

希尔排序(Shell Sort)是插入排序的一种,是针对直接插入排序算法的改进。该方法又称缩小增量排序.

(1)选取一个小于n的整数d1作为第一个增量,把序列的全部元素分成d1个组。

  所有距离为d1的倍数的元素放在同一个组中,在各组内进行直接插人排序。

(2)选取第二个增量d2<d1重复上述的分组和排序。

(3)重复(2)步骤,直至所取的增量dx=1,整个数据合成为一组,构成一组有序记录,则完成排序。

一般而言,初始增量d1 选取序列长度n 的一半, 第二个增量d2 为 d1 的一半,即每次取上一次增量的一半。


2.算法分析:

时间复杂度:   最好O(N)    最坏:O(N^2)

空间复杂度:O(1)

稳定性:不稳定

3.算法实现:

在不同的增量下,排序操作是一样的——先按照增量分组,再组内进行排序,所以最外层为增量变化的循环。
在增量相同的情况下,各组组内操作相同,所以先进行分组。
最后,组内进行直接插入排序(也可改进为折半插入排序 )。
总共3层for 循环。

public static void ShellInsertSort(int[] array){int len =array.length;//增量for(int gap = len/2; gap > 0; gap/=2){for(int i=0; i < gap ; i++){//组内采用直接插入法 进行排序for (int j =i+gap ;j < len; j += gap){int t = array[j];int k =j-gap;while(k >= 0 && array[k] > t){array[k+gap] = array[k];k-=gap;}array[k+gap] = t;}}}}

注:

直接插入排序是稳定的,而希尔排序不稳定

直接插入排序更适合原始记录基本有序的序列。

希尔排序的比较和移动次数均比直接插入排序少,n越大,效果越明显。

0 0
原创粉丝点击