【python数据结构算法】排序算法 #冒泡 #选择排序 #快排 #插入排序

news2024/11/28 8:00:26

思维导图


 

 一、经典冒泡

冒泡排序:是一种简单的排序算法,它重复的遍历要排序的序列,一次比较两个元素,如果他们的顺序错误,就把他们交换过来。

冒泡排序算法的运作如下:

  • 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码如下:

def bubble_sort(lst):
    n = len(lst)
    # 遍历所有数组元素
    for i in range(n):
        # 由于每次遍历都会将最大的元素移动到末尾,
        # 所以每次遍历都可以少比较一次已经排好序的末尾元素
        for j in range(0, n - i - 1):
            # 如果当前元素比下一个元素大,则交换它们
            if lst[j] > lst[j + 1]:
                lst[j], lst[j + 1] = lst[j + 1], lst[j]

# 测试代码
lis = [34, 2, 67, 43, 99, 43, 9, 12, 71]
bubble_sort(lis)
print(lis)

二、选择排序 

选择排序的运作如下:

 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

 代码示例:

def selection_sort(lst: list) -> list:

    n = len(lst)
    for i in range(n):
        # 假设当前位置i是最小值的索引
        min_index = i
        # 在剩余未排序部分中找到最小值的索引
        for j in range(i + 1, n):
            if lst[j] < lst[min_index]:
                min_index = j
        # 将找到的最小值与当前位置i的值进行交换
        lst[i], lst[min_index] = lst[min_index], lst[i]


# 测试代码
lis = [34, 2, 67, 43, 99, 43, 9, 12, 71]
sorted_lis = selection_sort(lis)  # 调用函数并接收排序后的列表(尽管原列表已被修改)
print(sorted_lis)  # 打印排序后的列表

 三、插入排序

概念和原理:

定义:每次将待排序中的第一个元素,放入已排序列表中对应的位置

原理:每一步从待排序列中选取第一个元素,将其插入到之前已排序序列中,直到待排序列所有元素排完,则结束排序

def insert_sort(l: list):
    for i in range(1, len(l)):
        key = l[i]  # 保存当前要插入的元素
        j = i
        # 将大于key的已排序元素向后移动一个位置
        while j > 0 and l[j-1] > key:
            l[j] = l[j-1]
            j -= 1
        # 将key插入到正确的位置
        l[j] = key

# 测试代码
lis = [34, 2, 67, 43, 99, 43, 9, 12, 71]
insert_sort(lis)
print(lis)  # 输出应该是 [2, 9, 12, 34, 43, 43, 67, 71, 99]

四、快速排序

基本思想

  • 快速排序是一种分治算法。
  • 它选择一个基准元素(pivot),将数组分成两部分:一部分包含所有小于基准的元素,另一部分包含所有大于基准的元素。
  • 然后递归地对这两部分进行快速排序

 代码如下:

def part(l:list,left,right):
    p=l[left]
    while left<right:
        while l[right]>=p and left<right:
            right-=1
        l[left]=l[right]
        while l[left]<=p and left<right:
            left+=1
        l[right]=l[left]
    l[left]=p
    return left

def quick_sort(l:list,left,right):
    if left<right:
        p_index=part(l,left,right)
        quick_sort(l,left,p_index-1)
        quick_sort(l,p_index+1,right)


lis=[34,2,67,43,99,43,9,12,71]
quick_sort(lis,0,len(lis)-1)
print(lis)

或者用列表推导式:

def quicksort(arr):
    """
    对输入的数组进行快速排序。

    参数:
    arr (list): 需要排序的数组

    返回:
    list: 排序后的数组
    """
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[len(arr) // 2]  # 选择中间元素作为基准
        left = [x for x in arr if x < pivot]  # 所有小于基准的元素
        middle = [x for x in arr if x == pivot]  # 所有等于基准的元素
        right = [x for x in arr if x > pivot]  # 所有大于基准的元素
        return quicksort(left) + middle + quicksort(right)

# 测试代码
if __name__ == "__main__":
    sample_array = [3, 6, 8, 10, 1, 2, 1]
    sorted_array = quicksort(sample_array)
    print("排序后的数组:", sorted_array)

五、希尔排序

称为递减增量排序。它通过比较距离较远的元素来工作,然后逐渐减少这个间隔,直到它变成1,这时数组就几乎是有序的了,最后进行一次普通的插入排序。

def quicksort(arr):
    """
    对输入的数组进行快速排序。

    参数:
    arr (list): 需要排序的数组

    返回:
    list: 排序后的数组
    """
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[len(arr) // 2]  # 选择中间元素作为基准
        left = [x for x in arr if x < pivot]  # 所有小于基准的元素
        middle = [x for x in arr if x == pivot]  # 所有等于基准的元素
        right = [x for x in arr if x > pivot]  # 所有大于基准的元素
        return quicksort(left) + middle + quicksort(right)

# 测试代码
if __name__ == "__main__":
    sample_array = [3, 6, 8, 10, 1, 2, 1]
    sorted_array = quicksort(sample_array)
    print("排序后的数组:", sorted_array)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统之fuser命令的基本使用

Linux系统之fuser命令的基本使用 一、fuser命令介绍二、fuser命令使用帮助2.1 help帮助信息2.1 基本语法①通用选项②文件/设备相关选项③网络相关选项④进程操作选项⑤其他选项 三、fuser命令的基本使用3.1 查找挂载点的进程3.2 查看指定设备进程信息3.3 查找监听特定端口的进…

stable Diffusion官方模型下载

v2-1_768-ema-pruned.safetensors 下载地址&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-2-1/tree/main 下载完成后&#xff0c;放到&#xff1a;E:\AITOOLS\stable-diffusion-webui\models\Stable-diffusion 模型&#xff1a;sd_xl_base_1.0.safetens…

《并查集算法详解及实用模板》

《重生我要成为并查集高手&#x1f354;&#x1f354;&#x1f354;》 并查集&#xff1a;快速查询和快速合并&#xff0c; 路径压缩&#xff0c; 按大小&#xff0c;高度&#xff0c;秩合并。 静态数组实现 &#x1f607;前言 在数据的海洋中&#xff0c;有一种悄然流淌的力量…

群聊前选择患者功能的实现

和普通群聊不同&#xff0c;开启一个图文会话聊天&#xff0c;必须先选择患者、团队、医生。 原来是集成到腾讯IM当中&#xff0c;现在需要单独写一个页面 原来的代码在这里&#xff1a; const handleShow () > {uni.navigateTo({url: /pageB/active-home/active-home})}…

基于边缘智能网关的机房安全监测应用

随着我国工业互联网的扎实推进&#xff0c;越来越多地区积极建设信息基础设施&#xff0c;以充沛算力支撑产业物联网的可持续发展&#xff0c;数据机房就是其中的典型代表。而且随着机房规模的扩大&#xff0c;对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…

unity 使用UI上的数字按钮,给text添加数字,并且显示光标,删除光标前数字,

今天有个需求&#xff0c;输入身份证&#xff0c;但是不用键盘&#xff0c;要点击按钮输入数字&#xff0c;并且可以控制光标&#xff0c; 1、数字按钮&#xff1a;点击后text添加数字内容 2、删除按钮&#xff1a;删除光标前的一个字符 3、左箭头&#xff1a;移动光标向左移动…

C++设计模式(单例模式)

一、介绍 1.动机 在软件系统中&#xff0c;经常有这样一些特殊的类&#xff0c;必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器&#xff0c;提供一种机制来保证一个类只有一个实例? 这应该是类设计者的…

Could not locate device support files.

报错信息&#xff1a;Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题&#xff1a;xcode15升级到xcode16之后&#xff0c;13.…

【Webgl_glslThreejs】制作流水效果/毛玻璃效果材质

效果预览 shadertory源码 source&#xff1a; https://www.shadertoy.com/view/lldyDs 材质代码 import { DoubleSide, ShaderChunk, ShaderMaterial, TextureLoader } from "three"; /** * * source https://www.shadertoy.com/view/lldyDs */export default fu…

海康VsionMaster学习笔记(学习工具+思路)

一、前言 VisionMaster算法平台集成机器视觉多种算法组件&#xff0c;适用多种应用场景&#xff0c;可快速组合算法&#xff0c;实现对工件或被测物的查找测量与缺陷检测等。VM算法平台依托海康威视在图像领域多年的技术积淀&#xff0c;自带强大的视觉分析工具库&#xff0c;可…

XML JSON

XML 与 JSON 结构 XML&#xff08;eXtensible Markup Language&#xff09; 1. 定义 XML 是一种标记语言&#xff0c;用于描述数据的结构和内容。主要用于数据存储与交换。 2. 特点 可扩展性&#xff1a;用户可以自定义标签。层次化结构&#xff1a;数据以树形结构组织&…

[VSCode] vscode下载安装及安装中文插件详解(附下载文件)

前言 vscode 链接&#xff1a;https://pan.quark.cn/s/3acbb8aed758 提取码&#xff1a;dSyt VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和Git版本控制系统。 …

wireshark基础

免责声明&#xff1a; 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;https://longyusec.com/ 泷羽sec B站地址&#xff1a;https:/…

李宏毅LLM探索(1)

1引入 1.1 提问&#xff1a;请列出你能做的事情&#xff0c;至少三十项&#xff0c;每一项都简单扼要:然后把你能做的事情制成文字云 文心一言生成&#xff1a; 以下是我能做的至少三十项事情&#xff0c;每一项都简单扼要地列出&#xff1a;回答问题 提供信息 生成文本 理解…

磁盘文件系统问题排查

1. ext4磁盘结构 块组&#xff1a;超级块&#xff1a;块位图&#xff1a;inode位图&#xff1a;inode表&#xff1a;空闲inode表&#xff1a;空闲块表&#xff1a;2. 块组结构 Group 0: (Blocks 0-32767) csum 0xfd42 [ITABLE_ZEROED]Primary superblock at 0, Group descript…

百度雪花算法id默认配置过期注意更新配置

百度雪花id项目地址&#xff1a;GitHub - baidu/uid-generator: UniqueID generator 默认配置根据redme看容易看迷糊&#xff0c;图和配置它压根就不是对应的 默认的配置如下 <!-- Specified bits & epoch as your demand. No specified the default value will be us…

(11)(2.2) BLHeli32 and BLHeli_S ESCs(二)

文章目录 前言 1 传递支持 前言 BLHeli 固件和配置应用程序的开发是为了允许配置 ESC 并提供额外功能。带有此固件的 ESC 允许配置定时、电机方向、LED、电机驱动频率等。在尝试使用 BLHeli 之前&#xff0c;请按照 DShot 设置说明进行操作(DShot setup instructions)。 1 传…

【初阶数据结构和算法】初识树与二叉树的概念以及堆和完全二叉树之间的关系

文章目录 一、树的概念与结构1.树的概念2.树的相关术语3.树的表示4.树形结构实际运用举例 二、二叉树的概念及特殊二叉树1.二叉树的概念2.特殊的二叉树满二叉树完全二叉树二叉树的性质(由满二叉树特点推导) 三、二叉树的存储结构1.二叉树的顺序结构2.二叉树的链式结构 四、堆和…

如何在Canvas中添加背景图片、图片元素和文字元素

Canvas是HTML5中一个强大的元素&#xff0c;它允许我们在网页上进行图形绘制。在本文中&#xff0c;我们将学习如何在Canvas中添加背景图片、图片元素以及文字元素。 创建Canvas元素 首先&#xff0c;我们需要在HTML文档中创建一个<canvas>元素。以下是创建一个500x500像…

单点登录深入详解之设计方案总结

基于cookie的单点登录解决方案 概述 用户登录之后 , 将认证信息存储至 Cookie &#xff0c;当再次访问本服务或者访问其他应用服务时&#xff0c;直接从 Cookie 中传递认证信息&#xff0c;进行鉴权处理。 问题 1. 如何保障Cookie内用户认证信息的安全性? 第一, Cookie…