网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

[golang]数据结构-希尔排序

除了上篇介绍的二分插入排序,还有这次介绍的希尔排序(Shell's Sort),也是对直接插入排序算法的优化。

成都创新互联公司-专业网站定制、快速模板网站建设、高性价比六安网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式六安网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖六安地区。费用合理售后完善,10多年实体公司更值得信赖。

原理
希尔排序,就是按某个增量值对数据进行分组,每组单独排序好后,再缩小这个增量,然后按新增量对数据分组后每个分组再各自排序。最终增加缩小到1的时候,排序结束。所以希尔排序又叫缩小增量排序(Diminishing Increment Sort)

关于增量
最佳增量值的选择其实是个数学难题,有兴趣的可以自己搜下相关资料。
常用的增量有 n/2(这个又叫希尔增量)、n/3、2^k-1(hibbard增量)等,实际使用中稍微改版增量也可能使排序的性能产生很大的波动。
比如使用n/2的增量,就是初始增量就是 length/2 ,第二轮分组时就再除2:length/4,直至增量值变成1

流程
假设有个数组:[8,12,6,33,12,5,4,94,63,23,75,22,43,27,46],以n/2为增量,那么整个排序流程就是这样的:
[golang] 数据结构-希尔排序

复杂度
不同增量复杂度不同。n/2时平均的时间复杂度为O(n^2)。
相较直接插入排序,希尔排序减少了比较和交换的次数,在中小规模的排序中,性能表现较好。但随着数据量增大,希尔排序与其他更好的排序算法(快排、堆排、并归等)仍有较大差距。

代码

package main

import (
    "fmt"
    "time"
    "math/rand"
)

func main() {
    var length = 15
    var list []int

    // 以时间戳为种子生成随机数,保证每次运行数据不重复
    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    for i := 0; i < length; i++ {
        list = append(list, int(r.Intn(1000)))
    }
    fmt.Println(list)

    // 这里就以n/2为增量z
    gap := 2
    step := length / gap

    for step >= 1 {
        // 这里按步长开始每个分组的排序
        for i := step; i < length; i++ {
            // 将按步长分组的子队列用直接插入排序算法进行排序
            insertionSortByStep(list, step)
        }
        // 完成一轮后再次缩小增量
        step /= gap

        // 输出每轮缩小增量各组排序后的结果
        fmt.Println(list)
    }
}

// 这里把上篇直接选择排序的算法抽出来,并将步长从1改成step
func insertionSortByStep(tree []int, step int) {
    for i := step; i < len(tree); i++ {
        for j := i; j >= step && tree[j] < tree[j-step]; j -= step {
            tree[j], tree[j-step] = tree[j-step], tree[j]
        }
    }
}

运行结果
[golang] 数据结构-希尔排序


网站名称:[golang]数据结构-希尔排序
文章URL:http://bjjierui.cn/article/jgpecj.html

其他资讯