Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

这篇具有很好参考价值的文章主要介绍了Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、希尔排序

  • 希尔排序(shell sort)是一种分组插入排序算法
  • 首先取一个整数d1=n/2,将元素分为d1个组,每组相邻两元素之间距离为d1,在各组内进行直接插入排序
  • 取第二个整数d2=d1/2,重复上述分组排序过程,知道di=1,即所有元素在同一组内进行直接插入排序。
  • 希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序

 例如:按照距离d1=n/2,将整个列表分为4组(例子中n=9)

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

(1) 分别为

  • 第一组 5,3,8
  • 第二组 7,1
  • 第三组 4,2
  • 第四组 6,9

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

(2)  然后在组内进行插入排序

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 (3)然后在取整数d2=d1/2

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 (4)当d2的时候,将数组分为了两组,间隔为2的是一组,然后组内又进行插入排序

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 (5)组内排序之后的结果图:

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 (6)d3=d2/2,此时距离d3为1的为一组(当d3=1的时候相当于直接进行插入排序)

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 (7)结果如图所示:

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 (8)代码

def inseart_search_gap(list, gap):
    '''
    :param list: 列表
    :param gap: 分的组
    :return:
    '''
    for i in range(gap, len(list)):
        temp = list[i]
        j = i - gap
        while j >= 0 and list[j] > temp:
            list[j + gap] = list[j]
            j -= gap
        list[j + gap] = temp


def shell_sort(li):
    '''希尔排序'''
    d = len(li) // 2
    while d >= 1:
        inseart_search_gap(li, d)
        d //= 2

Note:

插入排序其实可以看成距离gap=1的情况

2、希尔排序的讨论

希尔排序的时间复杂度比较复杂,并且与选择的gap序列有关

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 3、计数排序

  • 对列表进行排序,已知列表中的数的取值范围都在0到100之间。设计时间复杂度为O(n)的算法

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

# 计数排序
import random


def count_sort(li, max_count=100):
    '''
    :param li:列表
    :param max_count:列表中最大取值
    '''
    count = [0 for _ in range(max_count + 1)]
    # 表示无论我遍历到第几次,不关心当前值是多少,而是一律输出0,因为取值范围是0-100,所以在生成列表的时候,我们要考虑到101
    for val in li:
        count[val] = count[val] + 1
    # 清空原列表,避免新建列表
    li.clear()
    for index, value in enumerate(count):
        for i in range(value):
            li.append(index)


li = [random.randint(0, 100) for _ in range(1000)]
print(li)
count_sort(li)
print(li)

Note:

  • 缺陷如下:
    • 开辟列表空间浪费资源,比如取值范围是0-100就需要列表长度为100的列表
    • 需要知道给定数据的取值范围

 4、桶排序

  • 在计数排序中,如果元素的范围比较大(比如在1到1亿之间),如何改造算法
  • 桶排序(Bucket Sort):首先将元素分在不同的桶中,在对每个桶中的元素排序

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

# 桶排序
def bucket_sort(li, n=100, max_number=10000):
    '''
    :param li: 列表
    :param n: 分成多少桶
    :param max_number:最大取值范围
    '''
    buckets = [[] for _ in range(n)]  # 列表生成式(创建桶),例如:[[],[],[],...]
    for var in li:
        # 例如:每个桶放的范围是(max_number//n),假设var是86,那么它应该放在0号桶内,var整除(max_number//n)是0
        # 其中n-1表示最后一个桶,min()函数用于防止桶越界,即使数字为10000,也放入最后一个桶
        i = min(var // (max_number // n), n - 1)  # (表示var放到几号桶内)
        buckets[i].append(var)
        # for 循环结束元素都放入桶中
        for j in range(len(buckets[i]) - 1, 0, -1):  # 对第i号桶进行排序,j表示桶内最后一个元素开始,这里写0是因为前包后不包,范围到1号位置元素
            # [0,2,4,3] 假设放入的元素为3,需要j从最后遍历到2这个元素位置
            if buckets[i][j] < buckets[i][j - 1]:
                # 交换元素
                buckets[i][j], buckets[i][j - 1] = buckets[i][j - 1], buckets[i][j]
            else:
                break
    sort_li = []  # 新建列表
    for buc in buckets:
        sort_li.extend(buc)  # 将一个列表加到另一个列表后面
    return sort_li

Note:

  • 桶排序的表现取决于数据的分布。也就是要对不同数据排序时采用不同的分桶策略
  • 平均情况时间复杂度:O(n+k)
  • 最坏情况时间复杂度:O(n^2*k)
  • 空间复杂度:O(nk)
  • 数据排序部分可以根据实际需要进行优化

5、基数排序

 (1)多关键字排序

  • 假如现在有一个员工表,要求按照薪资排序,年龄相同的员工按照年龄排序
    • 先按照年龄排序,再按照薪资进行稳定排序(稳定:相对位置不变
  • 对32,13,94,52,17,54,93进行排序,是否可以看做多关键字排序

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 Note:

  • 先按照个位数分桶

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 

  • 然后依次输出

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

  •  按照十位数分桶

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

  •  在依次输出

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

 (2)基数排序的实现

def radix_sort(li):
    max_num = max(li)  # max value 8->1 99->2 888->3 9999->4
    it = 0  # 迭代次数
    while 10 ** it <= max_num:
        buckets = [[] for _ in range(10)]
        for var in li:
            # 找某一位的数 987   it=1 取个位:987%10(取模)  it=2 取十位:987//10=98   98%10=8
            digit = (var // 10 ** it) % 10
            buckets[digit].append(var)
        # 分桶结束
        li.clear()
        for buc in buckets:
            li.extend(buc)
        # 重新写回li
        it += 1


import random

li = list(range(100))
random.shuffle(li)
radix_sort(li)
print(li)

Note:文章来源地址https://www.toymoban.com/news/detail-465590.html

  • 时间复杂度:O(Kn)
  • 空间复杂度:O(K+n)
  • K表示数字位数

到了这里,关于Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法:插入排序&希尔排序

    假设现在你有一个有序的数组,你要把一个数据插入到数组中,保证插入后依然有序,要怎么做? 对于人来说,这个问题就像是在整理扑克牌,瞄一眼就知道应该插入什么位置。但是对于程序来说,就需要一一对比,直到找到一个位置 左边比它大,右边比它小 ,就算找到了

    2024年01月17日
    浏览(57)
  • 【数据结构与算法】:插入排序与希尔排序

    🔥 个人主页 : Quitecoder 🔥 专栏 : 数据结构与算法 欢迎大家来到初阶数据结构的最后一小节:排序 排序是一种将一组对象按照某种特定顺序重新排列的过程。在计算机科学中,排序是数据处理中非常基本且重要的操作,它可以帮助人们更有效地理解和分析数据。排序的顺序

    2024年03月18日
    浏览(39)
  • 【数据结构与算法】插入排序和希尔排序

      目录 一.插入排序  InsertSort 基本思想 动图演示  特性总结 二.希尔排序  ShellSort 基本思想 图例 特性总结 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 当插入第i(i=1)个元素

    2023年04月18日
    浏览(89)
  • 【数据结构与算法】直接插入排序和希尔排序

    进入了初阶数据结构的一个新的主题——排序。所谓排序,就是一串记录, 按照其中的某几个或某些的大小(一定的规则) , 递增或递减排列起来的操作 。 排序的 稳定性 :在一定的规则下,两个值相等的元素,在排序算法处理前后的相对位置是否发生变化,如果相

    2024年04月13日
    浏览(43)
  • 【数据结构与算法】排序算法(选择排序,冒泡排序,插入排序,希尔排序)

    基本概念这了就不浪费时间解释了,这四种都是很简单的排序方式,本专栏后续文章会出归并排序,计数排序,快速排序,堆排序,桶排序等排序算法,今天这篇文章中给出选择排序,冒泡排序,插入排序和希尔排序的实现; 如果发现文章中有错误,还请大家指出来,我会非

    2024年02月15日
    浏览(85)
  • 【数据结构与算法篇】手撕排序算法之插入排序与希尔排序

    ​👻内容专栏:《数据结构与算法篇》 🐨本文概括: 讲述排序的概念、直接插入排序、希尔排序、插入排序和希尔排序的区别。 🐼本文作者:花 碟 🐸发布时间:2023.6.13 排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的

    2024年02月09日
    浏览(51)
  • 【数据结构】排序算法(一)—>插入排序、希尔排序、选择排序、堆排序

    👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.直接插入排序 2.希尔排序 3.直接选择排序 4.堆排序 本篇文章博主将介绍排序算法中的插入排序:直接

    2024年02月08日
    浏览(49)
  • 数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)

    目录 引例 希尔增量序列 原始希尔排序 代码(C语言) 时间复杂度 更多增量序列 Hibbard增量序列 Sedgewick增量序列 希尔排序(by Donald Shell) 给以下序列进行排序:  先以5的间隔进行插入排序:  再以3的间隔进行插入排序: 最后再以1为间隔做插入排序,即常规插入排序 ,得

    2024年02月16日
    浏览(49)
  • 【数据结构】常见排序算法——常见排序介绍、插入排序、直接插入排序、希尔排序

      在计算机科学中,排序是将一组数据按照指定的顺序排列的过程。排序算法由于执行效率的不同可以分为多种不同的算法。   通常情况下,排序算法可以分为两类,即 内部排序和外部排序 。内部排序是指数据全部加载到内存中进行排序,适用于数据量较小的情况,而

    2024年02月08日
    浏览(63)
  • 直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”

    各位CSDN的uu们你们好呀,今天小雅兰的内容是数据结构与算法啦,是排序!!!下面,让我们进入七大排序的世界吧!!! 排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在

    2024年02月15日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包