算法学习总结(七):希尔排序

一、算法简介

  希尔排序的实质就是分组插入排序,该方法又称缩小增量排序。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

二、算法描述

          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;
    }
}
-
原文地址:https://www.cnblogs.com/gugibv/p/5695623.html