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


    一、算法简介

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

    二、算法描述

              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;
        }
    }
    -
  • 相关阅读:
    MyBatis(五)动态SQL 之 foreach 标签
    MyBatis(五)动态SQL 之 bind绑定
    MyBatis(五)动态SQL 之 sql 标签(重用片段)
    MyBatis(五)动态SQL 之 choose(when、otherwise)标签
    Interesting Finds: 2008.04.19
    Interesting Finds: 2008.04.15
    Interesting Finds: 2008.04.22
    Interesting Finds: 2008.04.18
    Interesting Finds: 2008.04.17
    Interesting Finds: 2008.04.23
  • 原文地址:https://www.cnblogs.com/gugibv/p/5695623.html
Copyright © 2020-2023  润新知