刷题系列——排序算法

参考:README - 十大经典排序算法

1)排序算法分为内部外部排序两种,这个之前并不了解,外部排序需要访问外存的这个就是指需要额外内存比如另一个list或者dict存储中间结果。

2)稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同,这点之前也不了解。

1. 冒泡排序:每次比较两个元素,随着遍历数组,最小的元素会浮到数组顶端。

        1. 做完第一次遍历,最大的元素会到数组末端;每一次保证一个元素到了正确的位置,因此之后的遍历会逐渐缩短长度。

        2. 实现: j和i的边界可以注意一下,当前是优化的写法。

def bubble_sort(lista):
    num = len(lista)
    for j in range(1, num):
        for i in range(num - j):
            if lista[i] > lista[i + 1]:
                lista[i], lista[i + 1] = lista[i + 1], lista[i]
    print(lista)
    return lista

lista = [1,5,6,3,7,9,1]
bubble_sort(lista)

        3. 复杂度:最小O(n)是已经正序,最大O(n^2)是倒序,平均O(n^2),空间复杂度O(1),稳定,In-place。

2. 选择排序:每次遍历选择出最大/小元素放在尾/首,下一次选择次之。

        1. 需要记录最大/小元素的索引,涉及到交换最大/小元素和首/尾元素。

        2. 实现        

def select_sort(lista):
    num = len(lista)
    for i in range(num - 1):
        min_ele = i
        for j in range(i + 1, num):
            if lista[j] < lista[min_ele]:
                min_ele = j
        lista[i], lista[min_ele] = lista[min_ele], lista[i]
    print(lista)
    return lista

        3. 复杂度:最小O(n^2),最大O(n^2),平均O(n^2),空间复杂度O(1),不稳定,In-place。

        4. 不稳定这个点需要注意,涉及到交换位置,所以相同大小元素本来的顺序会被打乱。

3. 插入排序:类比扑克牌

        1. 保证一个已排列数组,插入的数据从后扫描已排列数组然后插入。

        2. 把一个数组划分已排列和未排列待插入部分。

        3. 实现:注意j的变化, j -= 1

def insert_sort(lista):
    num = len(lista)
    for i in range(1, num):
        j = i
        while j - 1 >= 0 and lista[j] < lista[j - 1]:
            lista[j - 1], lista[j] = lista[j], lista[j - 1]
            j -= 1
                
    print(lista)

        4. 最小O(n),最大O(n^2),平均O(n^2),空间复杂度O(1),稳定,In-place。

4. 希尔排序:递减增量排序算法

        1. 对插入排序的优化:将待排序部分划分为子序列,各自基本有序后,之后再插入排序。包含有归并的思路。

        2. 子序列的划分方式是很重要的,如果连续几个数划分为一个子序列,对整体效率是无影响的,因此需要采用增量划分。

        3. 增量是指划分的子序列的个数,增量递减直到为1,排序结束。

​​​​​​​

        3. 不稳定因为子序列的排序会打乱原顺序。

        4. 实现

def shell_sort(lista):
    num = len(lista)
    increment = num // 2
    while increment > 0:
        for i in range(increment, num):
            idx = i
            while idx >= increment and  lista[idx] < lista[idx - increment]:
                lista[idx], lista[idx - increment] = lista[idx - increment], lista[idx]
                idx -= increment
        increment //= 2
    print(lista)

        5. 最小O(nlgn),其他不太确定,空间复杂度O(1),不稳定因为包含了插入排序,In-place。

5. 归并排序:分治法,需要额外空间

        1. 分为自上而下的递归和自下而上的迭代,这点还不是很理解。

        2. 参考:【Python入门算法23】排序入门:高效的归并排序 mergesort 的4种写法 - 知乎

        3. 实现

    
def merge_sort(lista):
    if len(lista) == 1:
        return lista
    idx = len(lista) // 2
    left = merge_sort(lista[:idx])
    right = merge_sort(lista[idx:])
    merged = merge_1(left, right)
    print(merged)
    return merged

def merge(lista, listb):
    merged = []
    a, b = len(lista), len(listb)
    i, j = 0, 0
    while i < a and j < b:
        if lista[i] < listb[j]:
            merged.append(lista[i])
            i += 1
        else:
            merged.append(listb[j])
            j += 1
    merged.extend(lista[i:])
    merged.extend(listb[j:])
    return merged

def merge_1(lista, listb):
    if not lista:
        return listb
    if not listb:
        return lista
    
    if lista[0] < listb[0]:
        return [lista[0]] + merge_1(lista[1:], listb)
    else:
        return [listb[0]] + merge_1(lista, listb[1:])

6. 快速排序:采用分治法

        1. 找到基准,基准左边比基准小,右边比基准大。

        2. 对冒泡排序的改进,是内部排序的最优。

        3. 实现 

def quick_sort(lista, start, end):
    if start >= end:
        return lista[start:end]
    pivot = lista[start]
    left = start
    right = end
    while left < right:
        while lista[right] >= pivot and left < right:
            right -= 1
        while lista[left] < pivot and left < right:
            left += 1
        lista[left], lista[right] = lista[right], lista[left]
    lista[left] = pivot
        
    quick_sort(lista, start, left-1)
    quick_sort(lista, left+1, end)
    print(lista)

7. 堆排序:利用堆的数据结构,大顶堆用于升序排序和小顶堆用于降序排序

        1. 构建堆,交换堆元素,重新构建堆

        2. 参考:​​​​​​​Python实现堆排序_堆排序python-CSDN博客

        3. 实现 

def heap_sort(lista):
    idx = len(lista) // 2 - 1
    for i in range(idx, -1, -1):
        heapify(lista, i, len(lista) - 1)
    for i in range(len(lista) - 1, -1, -1):
        lista[i], lista[0] = lista[0], lista[i]
        heapify(lista, 0, i - 1)
    print(lista)
    return lista

def heapify(lista, start, end):
    root = start
    left = root * 2 + 1
    while left <= end:
        if left + 1 <= end and lista[left] < lista[left + 1]:
            left += 1
        if lista[root] < lista[left]:
            lista[root], lista[left] = lista[left], lista[root]
            root = left
            left = root * 2 + 1
        else:
            break 

        4. 平均复杂度Ο(nlogn),不稳定。

8. 计数排序:需要额外空间

        1. 将输入的值转化为key存储在额外的空间中

        2. 实现

def counting_sort(lista):
    n = len(lista)
    min_v = 222222222
    max_v = 0
    for ele in lista:
        if ele > max_v:
            max_v = ele
        if ele < min_v:
            min_v = ele
    num = max_v - min_v + 1
    listb = [0] * num
    for i in lista:
        listb[i - min_v] += 1
    idx = 0
    for i in range(max_v - min_v + 1):
        for j in range(listb[i]):
            lista[idx] = i + min_v
            idx += 1
    print(lista)
    return lista

        3. 平均复杂度Ο(n+k),这个k的部分暂时不是很理解,空间复杂度O(k)。Out-place,不稳定。

9. 桶排序:计数排序的升级版

        1. 包括分桶和合并两部分,对桶内的数据进行排序,再把桶内排序好的数据取出,又称为箱排序

        2. 实现:里面调用了冒泡排序,调用快排时发现上面的代码有问题

def bucket_sort(lista):
    listb = []
    min_value = 222222222222
    max_value = 0
    for i in lista:
        if i > max_value:
            max_value = i
        if i < min_value:
            min_value = i
    bucket_num = (max_value - min_value) // 3 + 1
    buckets = [[] for i in range(bucket_num)]
    for i in lista:
        buckets[(i - min_value) // 3].append(i)
    print(buckets)
    for b in buckets:
        b = bubble_sort(b)
        print(b)
        listb.extend(b)
    print(listb)

        3. 是否稳定决定于桶内的排序算法。最快情况是数据被桶平分(n/k),具体复杂度决定于桶内的排序算法。

10. 基数排序:非比较型的排序算法,和桶排序思想类似

        1. 除了对整数排序,也可以用于浮点数,字符串等。

        2. 按位数分桶,分为MSD,LSD两种方法。

        3. 实现

def radix_sort(lista):
    max_value = max(lista)
    place = 0
    while max_value >= 10 ** (place):
        place += 1
    buckets = [[] for i in range(10)]
    for i in range(place):
        for j in lista:
            ele = j % (10 ** (i + 1))
            buckets[ele].append(j)
        k = 0
        for bucket in buckets:
            if bucket:
                lista[k] = bucket.pop(0)
                k += 1
    print(lista)

        4. 时间复杂度O(d(n+k)),d是最大值的位数,k是桶个数,n是队列长度。稳定,Out-place。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/216688.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DFT新手教程:VASP中ISIF取值设置

新手初学VASP计算时首先接触到的就是结构优化的计算任务。 在结构优化中&#xff0c;INCAR中的关键参数包括 IBRION &#xff0c;NSW&#xff0c;ISIF&#xff0c;EDIFF和EDIFFG 各个参数均可在vaspwiki查到可设置的参数以及该参数所具有的设置的含义。 https://www.vasp.at/…

Shopify二次开发之三:liquid语法学习(访问Objects和Schema数据模型)

目录 Objects &#xff08;对象&#xff09; 全局对象 all_products&#xff1a;商店中所有的商品 articles: 商店中的所有文章 collections&#xff1a;商店中所有的集合 模板对象 在product.json&#xff08;配置的section中) 访问product对象 在collection.json中可…

软著项目推荐 深度学习的口罩佩戴检测 - opencv 卷积神经网络 机器视觉 深度学习

文章目录 0 简介1 课题背景&#x1f6a9; 2 口罩佩戴算法实现2.1 YOLO 模型概览2.2 YOLOv32.3 YOLO 口罩佩戴检测实现数据集 2.4 实现代码2.5 检测效果 3 口罩佩戴检测算法评价指标3.1 准确率&#xff08;Accuracy&#xff09;3.2 精确率(Precision)和召回率(Recall)3.3 平均精…

span标签点击去掉光标

很简单&#xff0c;一行样式搞定 caret-color: transparent;

python获取阿里云云解析dns的域名解析记录

最近由于工作原因接触到阿里云的服务&#xff0c;我需要实时获取所有的域名信息&#xff0c;用于对其进行扫描&#xff0c;因此写了一个自动化爬取脚本 给需要的人分享。 &#xff08;阿里云有官方的demo&#xff0c;有兴趣的可以自己看一下&#xff0c;后面也会放链接&#xf…

【axios】拦截器:axios.interceptors.request.use|axios.interceptors.response.use

文章目录 概述设置拦截器Axios 拦截器的实现任务注册任务编排任务调度 来源 概述 axios有请求拦截器&#xff08;request&#xff09;、响应拦截器&#xff08;response&#xff09;、axios自定义回调处理&#xff08;这里就是我们常用的地方&#xff0c;会将成功和失败的回调…

小红书种草笔记多少钱?给大家揭秘

小红书&#xff0c;一个以生活方式分享为主题的社交电商平台&#xff0c;吸引了众多年轻用户。种草笔记&#xff0c;是指用户在小红书上分享的关于某一产品或服务的使用体验、心得感悟&#xff0c;通过图文并茂的形式&#xff0c;激发其他用户的好奇心和购买欲望&#xff0c;从…

ssm农业信息管理系统源码和论文

摘 要 网络的广泛应用给生活带来了十分的便利。所以把农业信息管理与现在网络相结合&#xff0c;利用java技术建设农业信息管理系统&#xff0c;实现农业信息管理的信息化。则对于进一步提高农业信息管理发展&#xff0c;丰富农业信息管理经验能起到不少的促进作用。 农业信息…

学习使用三个命令实现在腾讯云服务器TencentOS Server 3.1或者CentOS 8上安装ffmpeg

学习使用三个命令实现在腾讯云服务器TencentOS Server 3.1或者CentOS 8上安装ffmpeg Error: Unable to find a match: ffmpeg添加RPMfusion仓库安装SDL安装ffmpeg执行命令测试 Error: Unable to find a match: ffmpeg 添加RPMfusion仓库 yum install https://download1.rpmfus…

HTTP 和 HTTPS的区别

一、HTTP 1.明文传输&#xff0c;不安全 2.默认端口号&#xff1a;80 3.TCP三次握手即可 二、HTTPS 1.加密传输&#xff0c;更安全(在HTTP层与TCP层之间加上了SSL/TTL安全协议) SSL和TTL是在不同时期的两种叫法&#xff0c;含义相同。 2.默认端口号&#xff1a;443 3.TCP三…

全球与中国汽车电力电子市场:增长趋势、竞争格局与前景展望

目前&#xff0c;世界各国都致力于转向更环保、更永续的传统交通替代方案。 电动车满足所有要求&#xff0c;因为它们具有零废气排放、改善空气品质、减少温室气体排放并创造更清洁、更健康的环境。此外&#xff0c;电动车的运作成本比传统内燃机驱动的汽车低&#xff0c;因为…

SpringBoot系列之集成Jedis教程

SpringBoot系列之集成Jedis教程&#xff0c;Jedis是老牌的redis客户端框架&#xff0c;提供了比较齐全的redis使用命令&#xff0c;是一款开源的Java 客户端框架&#xff0c;本文使用Jedis3.1.0加上Springboot2.0&#xff0c;配合spring-boot-starter-data-redis使用&#xff0…

提升--21---JMM(Java内存模型)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 JMM--Java Memory ModelJMM 定义JMM规则&#xff1a;线程间通信的步骤&#xff1a; JMM的三大特性&#xff1a;原子性&#xff08;Atomicity&#xff09;可见性&…

【ElementUI】一行代码解决图片预览

【ElementUI】一行代码解决图片预览 只需要在图片标签上加入:preview-src-list 只需要在图片标签上加入:preview-src-list 完整代码如下&#xff1a; <el-table-column label"封面" align"center" prop"cover" :sort-orders"[descend…

亿发专业MES制造系统,现代化MES精益制造管理,建设数字化车间

在制造业信息化进程中&#xff0c;车间级信息化一直是薄弱环节&#xff0c;要提升车间自动化水平&#xff0c;可以发展MES技术。 MES&#xff08;制造执行系统&#xff09;强调对车间级的过程进行全面的集成、控制和监控&#xff0c;同时要合理配置和组织所有资源&#xff0c;以…

信而泰IPSec测试方法

什么是IPSec IPSec&#xff08;Internet Protocol Security&#xff09;是IETF&#xff08;Internet Engineering Task Force&#xff09;制定的一组开放的网络安全协议。它并不是一个单独的协议&#xff0c;而是一系列为IP网络提供安全性的协议和服务的集合&#xff0c;包括认…

【ArcGIS Pro微课1000例】0047:深度学习--棕榈树提取全流程

一、创建训练样本 对汤加科洛瓦伊种植园每棵棕榈树的健康状况进行清查和评估,这需要花费大量的时间和劳动力。 为简化此过程,将在 ArcGIS Pro 中使用深度学习模型来识别树木,然后根据植被绿度的测量值计算其健康状况。 第一步是找到显示汤加科洛瓦伊的影像,该影像具有足够…

vue2+electron桌面端一体机应用

vue2+electron项目 前言:公司有一个项目需要用Vue转成exe,首先我使用vue-cli脚手架搭建vue2项目,然后安装electron 安装electron 这一步骤可以省略,安装electron-builder时会自动安装electron npm i electron 安装electron-builder vue add electron-builder 项目中多出…

快手视频如何去掉水印?三个简单好用视频去水印方法

快手视频如何去掉水印&#xff1f;尽管新兴的短视频平台如春笋般涌现&#xff0c;吸引了众多观众在业余时间浏览和分享视频&#xff0c;快手作为当下主流短视频之一&#xff0c;许多自媒体创作者也常常会下载一些热门的视频素材进行二次编辑。然而&#xff0c;他们都可能会面临…

同旺科技 USB TO SPI / I2C --- 调试W5500_TCP Client接收数据

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 发送数据6个字节的数据&#xff1a;0x11,0x22,0x33,0x44,0x55,0x66 在专业版调试软件中编辑指令&#xff0c…