zoukankan      html  css  js  c++  java
  • 算法学习总结(七):希尔排序

    一、算法简介

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

    二、算法描述

              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;
        }
    }
    -
  • 相关阅读:
    VirtualBox 创建com对象失败
    大数据(十)
    HITCON 2014 已開始征求投稿计划书
    CSS
    工具
    工具
    Linux
    Python
    JavaScript
    JavaScript
  • 原文地址:https://www.cnblogs.com/gugibv/p/5695623.html
Copyright © 2011-2022 走看看