希尔排序

来源:互联网 发布:马克斯cms 资源站 编辑:程序博客网 时间:2024/05/21 16:26

基本思想:在直接插入排序中,只比较相邻的结点,一次比较最多把结点移动一个位置。如果对位置间隔较大距离的结点进行比较,使得结点在比较以后能够一次跨过较大的距离,这样就可以提高排序的速度。
希尔排序的基本过程:
设待排序的对象序列有n条记录,将整个待排序的记录序列分割成的若干子序列分别进行直接插入排序。
首先取一个记录间隔值d1 < n,把全部记录按此间隔值从第1条记录开始每间隔d1个取一个记录,这样便得到第一个子序列;再从第2条记录开始每间隔d1个取一个记录,这样便得到第二个子序列;……,共将全部记录分为d1个子序列。在每一个子序列中分别施行直接插入排序;然后缩小间隔d1重新分组(如取d2 = d1 /2 ),重复上述的子序列划分和排序工作,直到最后取dt= 1为止。
例如:10个数 取5 3 1
49 38 65 97 76 13 27 49 55 04
第一趟
13 27 49 55 04 49 38 65 97 76
第二趟:
13 04 49 38 27 49 55 65 97 76
第三趟
04 13 27 38 49 49 55 65 76 97

    //希尔排序    public static void ShellSort(int arr[]) {        int P,D,i;        for(D=arr.length/2;D>0;D/=2) {//希尔增量序列            for(P=D;P<arr.length;P++) {//插入排序                int Tmp=arr[P];                for(i=P;i>=D&&arr[i-D]>Tmp;i-=D) {                    arr[i]=arr[i-D];                }                arr[i]=Tmp;            }        }    }

希尔排序对中等大小的序列非常有效,对于较大的序列不是最好的选择,但是希尔排序是所有时间复杂度为O(n^2)的排序算法中最快的算法。
缺点:算法思路复杂。希尔排序比起归并、堆、快速排序慢,但是却是一种相对简单的算法。希尔排序对于数据量小于5000的序列是不错的选择
最佳情况是序列已经完全排序,此时比较次数较少。希尔排序的运行时间取决于所选择的增量序列。
最坏情况的时间复杂度取决于间隔序列,最好情况下:O(log^2(n))
最好情况的时间复杂度:O(n)
平均情况下的时间复杂度取决于间隔序列
最坏情况的空间复杂度:O(n)