常用排序算法汇总—Python版

news2025/1/11 22:37:06

在这里插入图片描述

一、选择排序

1. 原理:

选择排序(Selection Sort)是一种简单直观的排序算法,它的基本思路是将数组按顺序分成已排序部分和未排序部分,然后每次从未排序部分中选择出最小的元素,将其添加到已排序部分的末尾。重复这个过程,直到未排序部分为空,整个数组都已排好序。

2. 代码

def selection_sort(lst):
    n = len(lst)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if lst[j] < lst[min_idx]:
                min_idx = j
        lst[i], lst[min_idx] = lst[min_idx], lst[i]
    return lst

arr = [3, 5, 8, 1, 2, 9, 4, 7, 6]
sorted_arr = selection_sort(arr)
print(sorted_arr)

二、冒泡排序

1. 原理:

冒泡排序(Bubble Sort)是一种简单直观的排序算法,它的基本思路是重复地遍历数列,一次比较两个元素,如果它们的顺序错误,就交换位置。每一次遍历都将最大或最小的元素“浮”到了最顶端,因此得名冒泡排序。

2. 代码

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


lst = [8, 3, 5, 1, 2, 7, 6, 4]
sorted_lst = bubble_sort(lst)
print(sorted_lst)  # 输出 [1, 2, 3, 4, 5, 6, 7, 8]

三、插入排序

1. 原理:

插入排序(Insertion Sort)是一种简单直观的排序算法,它的基本思路是将未排序的元素一个一个插入到已经排序的部分中适当的位置上去。它的实现过程是将一个待排序的列表分成两部分,第一部分为已排序的,第二部分为未排序的,初始状态下第一部分为列表中的第一个元素,而第二部分为除第一个元素外的其他元素。在排序过程中,我们是从未排序部分中取出一个元素,将它插入到已排序部分中去。重复这个过程,直到未排序部分为空,整个列表都已排好序。

2. 代码

def insertion_sort(lst):
    n = len(lst)
    for i in range(1, n):
        key = lst[i]
        j = i - 1
        while j >= 0 and lst[j] > key:
            lst[j+1] = lst[j]
            j -= 1
        lst[j+1] = key
    return lst



lst = [8, 3, 5, 1, 2, 7, 6, 4]
sorted_lst = insertion_sort(lst)
print(sorted_lst)  # 输出 [1, 2, 3, 4, 5, 6, 7, 8]

该函数的主要实现过程如下:

  1. 遍历整个列表,从下标 i=1 开始,逐步将未排序部分添加到已排序部分中
  2. 选取未排序部分的第一个元素作为 key,将其与已排序部分逐一比较
  3. 如果 key 小于已排序部分的某一个元素,则将该元素向后移动一位,继续比较
  4. 如果 key 大于或等于已排序部分的某一个元素,则将 key 插入到该元素后面

四、归并排序

1. 原理:

归并排序(Merge Sort)是一种基于分治思想的排序算法,它的基本思路是将数组分成两个等长的部分,分别对这两部分进行递归排序,然后将排好序的两个子数组合并起来。因为归并排序的实现过程中需要开辟额外的空间来存储临时数组,所以归并排序不是基于比较排序的最优算法,但归并排序的时间复杂度通常很优秀,表现稳定。

2. 代码

def merge_sort(arr):
    # 递归终止条件,数组长度为 1
    if len(arr) == 1:
        return arr

    # 将数组一分为二,并递归对两个子数组进行排序
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])

    # 对排好序的子数组进行归并操作
    sorted_arr = []
    i = j = 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            sorted_arr.append(left[i])
            i += 1
        else:
            sorted_arr.append(right[j])
            j += 1

    sorted_arr += left[i:]
    sorted_arr += right[j:]

    return sorted_arr




lst = [8, 3, 5, 1, 2, 7, 6, 4]
sorted_lst = merge_sort(lst)
print(sorted_lst)  # 输出 [1, 2, 3, 4, 5, 6, 7, 8]

该函数的主要实现过程如下:

  1. 如果数组长度为 1,直接返回该数组(递归终止条件)
  2. 将数组一分为二,并递归对左右两个子数组进行排序,最终返回排好序的子数组
  3. 对排好序的子数组进行归并操作,通过比较两个子数组的首元素,不断将更小的元素添加到一个新的数组中,最终将子数组中剩余的元素也加入到新数组中来
  4. 返回归并后的新数组

五、快速排序

1. 原理

快速排序是一种基于分治思想的排序算法,它的基本思路是先找到一个基准值(pivot),将数组划分为两部分,使得左半部分的所有元素小于等于基准值,右半部分的所有元素大于基准值。然后对左右两个部分分别递归地进行同样的处理,直到整个数组有序。

2. 代码

def quick_sort(arr):
    # 如果数组长度小于等于 1,直接返回
    if len(arr) <= 1:
        return arr

    # 选择第一个元素为基准值,随机选择也是一种优化方法
    pivot = arr[0]

    # 使用列表推导式获取左侧和右侧子数组
    left = [x for x in arr[1:] if x <= pivot]
    right = [x for x in arr[1:] if x > pivot]

    # 递归调用快速排序,并将左右子数组拼接起来
    return quick_sort(left) + [pivot] + quick_sort(right)

lst = [8, 3, 5, 1, 2, 7, 6, 4]
sorted_lst = quick_sort(lst)
print(sorted_lst)  # 输出 [1, 2, 3, 4, 5, 6, 7, 8]

该函数的实现并不复杂,思路也比较清晰。主要包含以下步骤:

  1. 如果数组长度小于等于 1,直接返回该数组
  2. 选择第一个元素作为基准值,将数组划分为左右两个子数组,分别为左半部分 left 和右半部分 right
  3. 对左右子数组进行递归调用快速排序,并将将子数组返回值拼接成新数组,注意需要将基准值 pivot 放入中间

六、堆排序

1. 原理

在 heapify() 函数中,函数的参数 n 表示构成二叉树的前 n 个元素,参数 i 表示当前根节点在数组中的位置。该函数的作用是将以 i 为根节点的子树进行堆化,也就是将其变成一个最大堆。在实现过程中,需要不断检查左右子节点和根节点之间的大小关系,并进行必要的交换。

heap_sort() 函数中,先使用叶节点的父节点开始建立一个最大堆,然后对于数组中已经是最大堆的部分,每次提取根节点(最大值),并将其与堆结构末尾的值进行交换。整个排序过程时间复杂度为 O(nlogn)。

2. 代码

def heapify(arr, n, i):
    """
    以 i 为根节点,将 arr 中的前 n 个元素构成的二叉树进行堆化
    """
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2

    # 寻找最大值节点
    if left < n and arr[left] > arr[largest]:
        largest = left
    if right < n and arr[right] > arr[largest]:
        largest = right

    # 如果最大值节点不是 i,那么需要进行交换
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        # 递归堆化交换后的子树
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)

    # 构建最大堆
    for i in range(n//2 - 1, -1, -1):
        heapify(arr, n, i)

    # 逐个取出最大值
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        # 对前 i 个元素进行重新构建最大堆
        heapify(arr, i, 0)

    return arr

lst = [8, 3, 5, 1, 2, 7, 6, 4]
sorted_lst = heap_sort(lst)
print(sorted_lst)  # 输出 [1, 2, 3, 4, 5, 6, 7, 8]

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

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

相关文章

计算机网络|第三章:传输层

前文回顾&#xff1a;第二章&#xff1a;应用层 目录 &#x1f4da;概述和运输层服务 &#x1f407;运输层和网络层的关系 &#x1f407;因特网传输概述 &#x1f4da;多路复用和多路分解 &#x1f407;无连接的多路复用与多路分解 &#x1f407;面向连接的多路复用与多路…

【硬件】嵌入式电子设计基础之分析电路

电子技术&#xff08;electronics&#xff09;是我们研究科技产品的基石&#xff0c;本文章通过一系列简单且使用的实例&#xff0c;带领大家走进电子技术的世界&#xff0c;并通过对这些实例的分析&#xff0c;掌握其中的知识点和实用的电路分析设计技能。 本篇文章围绕着模拟…

三数之和(Java实现)

文章目录 思路1.暴力算法(超出时间限制)解题思路复杂度 2.双指针算法解题思路&#xff1a;注意点复杂度 Problem: 15. 三数之和 思路 1.暴力算法 2.双指针算法 1.暴力算法(超出时间限制) class Solution {public List<List<Integer>> threeSum(int[] nums) {// 检查…

使用TrieTree(字典树)来实现敏感词过滤

使用TrieTree&#xff08;字典树&#xff09;来实现敏感词过滤 1. 字典树定义 字典树&#xff08;TrieTree&#xff09;&#xff0c;是一种树形结构&#xff0c;典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串,如01字典树&#xff09;。…

Hive本地开发/学习环境配置

前提 hive依赖hadoop的相关组件&#xff0c;需要启动Hadoop的相关组件。 Hive 版本&#xff1a;3.1.3 Hadoop版本&#xff1a;3.3.4 hive-env.sh export HADOOP_HOME$HADOOP_HOME export HIVE_CONF_DIR/usr/local/Cellar/hive/3.1.3/libexec/conf export HIVE_AUX_JARS_PATH/…

micro-app的简单学习

本文承接上一篇手把手教你使用vue2搭建micro-app&#xff0c;对micro-app进行简单的认识与学习。 简述 因为上一篇只是对micro-app的搭建&#xff0c;并没有对具体的内容进行深入了解&#xff0c;所以本文是在上一篇文章代码的基础上对micro-app官网&#xff0c;的初步了解。…

Vue(标签属性:ref、配置项:props、混入mixin、插件、样式属性:scroped)

一、ref&#xff08;打标识&#xff09; 前面提及到了标签属性&#xff1a;keys 这里将了解ref&#xff1a;打标识 正常布置脚手架并创建入口文件main.js,引入组件 1. 可以给元素注册引用信息&#xff08;获取真实DOM&#xff09; 给一个按钮获取上方的dom的方法&#xff0c;方…

log4j2实现日志输出

引言 日志是我们在软件开发过程中非常重要的一个组成部分&#xff0c;它能够记录系统运行时的各种信息和异常&#xff0c;方便我们在需要的时候进行排查和调试。而Log4j2是目前最为流行的Java日志框架之一&#xff0c;它提供了丰富的日志输出方式和配置选项&#xff0c;可以满…

设计模式——装饰器模式(Decorator Pattern)

很久没有写博客了&#xff0c;最近也有很多事情要处理&#xff0c;也在努力的备考软件考试&#xff0c;正好模拟题中有一道关于装饰器模式的题&#xff0c;觉得还不错&#xff0c;所以特地写一篇文章希望能分享给小伙伴们。 装饰器模式的作用&#xff1a;允许向一个现有的对象…

vue3导入elcel表格并展示(使用xlsx插件+vite+element-plus)/js上传表格(js+xlsx)

表格内容(本博客演示的表格,这里其实可以更换任意表格,动态展示的) 安装插件xlsx npm install xlsx组件的所有代码(附解释) <script setup> import { ref } from "vue"; import * as XLSX from "xlsx"; // 把文件按照二进制进行读取 function read…

解密PyTorch动态计算图:打破深度学习束缚的秘密武器

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【C++】STL之priority_queue类源码剖析

目录 概述 算法 源码 PriorityQueue.h test.cpp 测试结果 概述 priority_queue&#xff1a;优先级队列&#xff0c;包含在头文件<queue>中 优先级队列类似于堆结构&#xff0c;优先级最高的元素被置为堆顶&#xff0c;最优先被弹出top()和删除pop() 优先级队列的…

Python凸包

文章目录 ConvexHullQG三维情况ConvexHull属性 ConvexHull ConvexHull是spatial中的一个类&#xff0c;主要功能是找到一组点的边缘&#xff0c;并做一个凸包。其必要的初始化参数为一个点集&#xff0c;点集格式为 n m n\times m nm维度的数组&#xff0c;n为点集中点的个数…

定位的特殊应用

注意&#xff1a;发生固定定位&#xff0c;绝对定位后&#xff0c;元素都变成了定位元素&#xff0c;默认高宽被内容撑开&#xff0c;则可以设置宽高&#xff1b;以下只针对绝对定位和固定定位的元素&#xff0c;不包括相对定位元素。 1.定位元素块的宽充满包含块 前提&#x…

封装建立-SMD封装

1. 看规格书&#xff0c;建立需要的焊盘&#xff0c;命名。注意padstack editor保存路径中不能有中文。 2.新建.dra工程&#xff0c;layout/pin 在里面筛选需要的焊盘。 3. 放置焊盘&#xff0c;需要计算精确坐标&#xff0c;allegro里command用x 0 0命令可以定位到原点。 4…

Python综合案例-学生数据可视化

近年来,数据分析和可视化已经成为了许多领域中的重要工具。在教育领域中,通过对学生的表现和行为进行数据分析和可视化,可以更好地了解学生的学习状态,发现问题、改进教学,并提高学生成绩。本文将介绍一个 Python 综合案例,使用 Pandas 和 Seaborn 库,对学生的数据进行清…

MySQL几种备份方式对比,你用对了吗?

各备份方法对比 备份数据的策略需要根据几种维度考虑 备份能承受最大丢失数据量 备份期间系统可以处于哪种情况&#xff08;不可用&#xff0c;部分可用&#xff0c;完全可用&#xff09; 数据恢复时长 需要恢复全量数据还是增量数据 备份数据的方法 逻辑备份&#xff1a;…

推荐算法实战项目:Deep Crossing 模型原理以及案例实战(附完整 Python 代码)

本文要介绍的Deep Crossing模型是由微软研究院在论文《Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features》中提出的&#xff0c;它主要是用来解决大规模特征自动组合问题&#xff0c;从而减轻或者避免手工进行特征组合的开销。 Deep Cross…

推荐算法实战项目:DCN 原理以及案例实战(附完整 Python 代码)

本文要介绍的是由斯坦福大学联合Google的研究人员发表的论文《Deep & Cross Network for Ad Click Predictions》中提出的Deep&Cross模型&#xff0c;简称DCN。 DCN模型是Wide&Deep的改进版本&#xff0c;其中Deep部分的设计思路与Wide&Deep没有发生本质的变化…

asp.net基于web的校园美食派送配送系统

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…