笔记 | 排序算法实现(Python)

news2024/12/28 20:02:49

排序算法

      • 一、选择排序
      • 二、合并/归并排序
      • 三、快速排序
      • 四、计数排序

排序类型时间复杂度
选择排序(Selection Sort) O ( n 2 ) O(n^{2} ) O(n2)
合并/归并排序(Merge Sort) O ( n log ⁡ n ) O(n\log n ) O(nlogn)
快速排序(Quick Sort)平均情况 O ( n log ⁡ n ) O(n\log n ) O(nlogn)最糟情况 O ( n 2 ) O(n^{2} ) O(n2)
计数排序(Counting Sort) O ( n + k ) O(n+k ) O(n+k)

一、选择排序

来自《算法图解》一书

def findSmallest(arr):
    smallest = arr[0]  # 存储最小值
    smallest_index = 0  # 存储最小值索引
    for i in range(1,len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index

def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest_ind = findSmallest(arr)
        newArr.append(arr.pop(smallest_ind))
    return newArr

print(selectionSort([5,3,6,2,10,58,23,31,9,14,4,46,25,35,1,56,29,20,18,43,40,36,49]))

结果:
在这里插入图片描述

二、合并/归并排序

参考: Python实现合并排序(归并排序)(一文看懂)

  1. 将一个序列从中间位置分成两个序列;
  2. 在将这两个子序列按照第一步继续二分下去;
  3. 直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。
def merge(arr_a, arr_b):
    arr_c = []
    i = j = 0
    while i < len(arr_a) and j < len(arr_b):
        if arr_a[i] < arr_b[j]:
            arr_c.append(arr_a[i])
            i += 1
        else:
            arr_c.append(arr_b[j])
            j += 1
    if i == len(arr_a):
        return arr_c + arr_b[j:]
    else:
        return arr_c + arr_a[i:]

def mergeSort(arr):
    if len(arr) < 2:
        return arr
    middle = len(arr) // 2
    left = mergeSort(arr[:middle])
    right = mergeSort(arr[middle:])
    return merge(left, right)

print(mergeSort([23,12,3,7,5,32,37,29,15,24,19]))

结果:
在这里插入图片描述

三、快速排序

来自《算法图解》一书

  1. 选择基准值
  2. 将数组分成两个子数组:小于基准值的元素和大于基准值的元素
  3. 对这两个子数组进行快速排序
def quickSort(arr):
    if len(arr) < 2:
        return arr  # 基线条件:为空或只包含一个元素的数组是“有序”的
    else:
        pivot = arr[0]  # 递归条件,基准值
        less = [i for i in arr[1:] if i <= pivot]  # 由所有小于基准值的元素组成的子数组
        greater = [i for i in arr[1:] if i > pivot]  # 由所有大于基准值的元素组成的子数组
        return quickSort(less) + [pivot] + quickSort(greater)

print(quickSort([10,28,2,36,45,23,14,39,32,24]))

结果:
在这里插入图片描述

四、计数排序

参考: python实现【计数排序】(Count Sort)

  1. 找出待排序的数组中最大和最小的元素;
  2. 统计数组中每个值为i的元素出现的次数,存入count_nums数组的第i项;
  3. 将count_nums数组中从左向右每一个计数不为0的值依次填充进最终的res排序数组中。
def countingSort(arr):
    max_value = max(arr)
    res = []
    count_nums = [0 for i in range(max_value + 1)]
    for num in arr:
        count_nums[num] += 1
    for i in range(len(count_nums)):
        if count_nums[i] != 0:
            # res.extend(count_nums[i] * [i]) # 元素i有 count_nums[i]个,添加入最终的排序数组
            res += count_nums[i] * [i]
    return res

print(countingSort([12,30,2,29,23,18,5,7,25,15,8]))

结果:
在这里插入图片描述

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

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

相关文章

Jmeter系列-阶梯加压线程组Stepping Thread Group详解(6)

前言 tepping Thread Group是第一个自定义线程组但&#xff0c;随着版本的迭代&#xff0c;已经有更好的线程组代替Stepping Thread Group了【Concurrency Thread Group】&#xff0c;所以说Stepping Thread Group已经是过去式了&#xff0c;但还是介绍一下 Stepping Thread …

1.2 向量代数

1.向量的概念 定义&#xff1a; 既有大小&#xff0c;又有方向。 向量的表示法 记有向线段的起点A与终点B&#xff0c;从点A指向B的箭头表示了这条线端的方向&#xff0c;线段的长度表示了这条线段的大小&#xff0c;向量就可用这样的一条有向线段来表示&#xff0c; 记作&a…

NTSC和PAL制同步信号模拟输出

NTSC和PAL制同步信号模拟输出 原由&#xff1a;由于我想输出一个NTSC制和PAL制的同步黑场&#xff0c;只需要输出同步信号&#xff0c;之后输出rgb信号给ADV&#xff08;7123&#xff09;后输出到显示屏。下面是我的心路历程和知识总结 一、了解NTSC和PAL PAL&#xff1a;电…

智能化电力运维:数字孪生的崭露头角

随着科技的不断发展&#xff0c;数字孪生技术在各个领域的应用愈发广泛&#xff0c;尤其在电力运维领域&#xff0c;它正发挥着革命性的作用。数字孪生是一种虚拟仿真技术&#xff0c;通过实时模拟真实世界的物理对象或过程&#xff0c;可以从多方面为电力运维带来改变&#xf…

程序员写好简历的5个关键点

程序员就业竞争大&#xff1f;找不到工作&#xff1f;也许&#xff0c;从简历开始你就被淘汰了.... 在很多的公司中&#xff0c;HR的招聘压力是很大的&#xff0c;浏览每个人的简历的时间可能只有20几秒&#xff0c;所以即使你的工作能力十分的强&#xff0c;但如果你没有在简…

批量剪辑视频,轻松添加上片头片尾!

亲爱的朋友们&#xff0c;你是否曾经需要为多个视频添加相同的片头片尾&#xff1f;现在&#xff0c;我们为你带来了一款实用的视频批量剪辑工具&#xff0c;可以让你轻松实现这一需求&#xff0c;提高工作效率&#xff01; 首先我们要进入好简单批量智剪主页面&#xff0c;并…

2023年8月国产数据库大事记-墨天轮

本文墨天轮社区整理的2023年8月国产数据库大事件和重要产品发布消息。 8月国产数据库大事记 TOP10 8月国产数据库大事记&#xff08;时间线&#xff09; 8月1日&#xff0c;强制性国家标准GB 18030-2022《信息技术 中文编码字符集》正式实施&#xff01;该标准适用范围是具备…

华为OD机试 - 最差产品奖 - 双端队列 deque(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

你为什么总招不到对的人?

办公室里&#xff0c;技术面试官Arron 和 HR 正对近期的招聘失误进行争执——新招的技术岗试用了几个月&#xff0c;就因能力不足离开了。 HR 不断吐槽岗位画像太模糊&#xff0c;Arron 反问&#xff1a;“不是给了你关键词吗&#xff1f;” HR 气不打一处来&#xff1a;“你…

QCefView 的 编译

CEF QCefView编译 学习QT加载网页时了解到CEF与QCefView, QCefView是一个与Chromium Embedded Framework集成的Qt第三方开源库&#xff0c;LGPL许可&#xff0c;可以在项目中免费使用&#xff0c;功能类似CEF、QWebEngineView&#xff0c;提供C和web交互的能力。 官方网址&a…

【PyQT5教程】-01入门PyQT5

PyQT介绍 1.Qt 1.1 介绍 Qt&#xff08;读作“cute”&#xff09;是一个跨平台的C应用程序开发框架&#xff0c;最初由挪威公司Trolltech&#xff08;现在是Qt公司的一部分&#xff09;开发。Qt提供了一系列工具和类库&#xff0c;用于开发图形界面应用程序、命令行工具和服务…

适用于Linux的Windows子系统(系统安装步骤)

目录 前言 一、WSL2安装 1.Microsoft参考文档&#xff08;推荐选择旧版 WSL 的手动安装步骤&#xff09; 2.开启子系统 二、Ubuntu安装 1.在Microsoft Store中获取ubuntu 2.运行ubuntu配置管理信息 3.ubuntu换源 三、WSL 与 Ubuntu的一些基础使用命令 四、Windows Terminal终端…

linux安装postgresql13

linux安装postgresql13 1. 安装2. 数据库初始化3.配置远程访问3.1 修改配置文件3.2 重启服务3.3 测试连接 1. 安装 linux下载链接&#xff1a;https://www.postgresql.org/download/linux/ubuntu/安装命令sudo sh -c echo "deb https://apt.postgresql.org/pub/repos/apt…

Qt-QTransform-内存结构-仿射变换-工作原理-C++

文章目录 1.概述2.内存结构3.矩阵乘法4.map函数5.QPaint-setWorldTransform6.总结 1.概述 QTransform是Qt中推荐的矩阵变换类。转换指定如何平移&#xff0c;缩放&#xff0c;剪切&#xff0c;旋转或投影坐标系&#xff0c;通常在渲染图形时使用。QTransform类支持矩阵乘法&am…

业务自动化工具Automatisch

什么是 Automatisch &#xff1f; Automatisch 是一种开源的 Zapier 替代业务自动化工具&#xff0c;可让您连接不同的服务&#xff0c;如 Twitter、Slack 等&#xff0c;以自动化您的业务流程。您可以使用 Automatisch 构建工作流程自动化&#xff0c;而无需花费时间和金钱。也…

【大虾送书第八期】揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例

目录 ✨写在前面 ✨分布式文件系统元数据的常见类型 &#x1f353;文件&#xff08;inode&#xff09;元数据 &#x1f353;数据块&#xff08;block&#xff09;元数据 &#x1f353;MountTable &#x1f353;Worker元数据 ✨分布式文件系统元数据的存储模式 &#x1f353;元数…

手写RPC框架--8.压缩报文

RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 压缩报文 对报文进行压缩a.报文压缩b.负载均衡c.使用模板方法优化负载均衡d.一致性hash-负载均衡算法d.1) 介绍d.2) 实现 e.实现心跳检测f.最短响应时间的负载均衡策略 对报文…

vue 将public文件下的图片引入.vue文件内

data() {return {publicPath:process.env.BASE_URL,} }<div :style"{backgroundImage: url(${publicPath}images/tradingRegular_images/rectBg.png)}">11 </div>

从一个向量类中理解Python 中的特殊方法(__init__、__getitem__、__len__、__repr__、__str__)

文章目录 前言一、init、getitem、len、repr、str解释二、向量案例1.实现属于我们自己的向量2.导入向量模块 前言 特殊方法是一种具有特殊命名约定的方法&#xff0c;用来定义类的行为与功能。当满足特定条件时&#xff0c;这些方法会被自动调用&#xff0c;从而实现一些内置的…

Splunk Enterprise for Mac:卓越的数据分析与管理工具

在当今的数字化时代&#xff0c;数据已经成为企业成功的核心驱动力。然而&#xff0c;如何有效地管理和分析这些数据&#xff0c;却常常让企业感到困惑。Splunk Enterprise for Mac 是一款领先的数据分析和管理工具&#xff0c;可以帮助你解决这一难题。 Splunk Enterprise fo…