10大排序总结

1. 冒泡排序 (Bubble Sort)

def bubble_sort(arr):n = len(arr)# 遍历数组中的每个元素for i in range(n):# 内层循环,从数组的第一个元素到倒数第 i + 1 个元素for j in range(0, n - i - 1):# 如果当前元素比下一个元素大,则交换if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]return arr

2. 选择排序 (Selection Sort)

def selection_sort(arr):n = len(arr)# 遍历数组中的每个元素for i in range(n):# 假设当前元素是最小值min_idx = i# 通过内层循环找到最小值的索引for j in range(i + 1, n):if arr[j] < arr[min_idx]:min_idx = j# 交换当前元素和找到的最小值arr[i], arr[min_idx] = arr[min_idx], arr[i]return arr

3. 插入排序 (Insertion Sort)

def insertion_sort(arr):# 从第二个元素开始遍历数组for i in range(1, len(arr)):key = arr[i]j = i - 1# 将当前元素插入到已排序部分的正确位置while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arr

4. 归并排序 (Merge Sort)

def merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2  # 找到数组的中间点L = arr[:mid]        # 将数组分成两部分R = arr[mid:]merge_sort(L)  # 递归排序左半部分merge_sort(R)  # 递归排序右半部分i = j = k = 0# 合并两个已排序的子数组while i < len(L) and j < len(R):if L[i] < R[j]:arr[k] = L[i]i += 1else:arr[k] = R[j]j += 1k += 1# 检查是否还有剩余的元素while i < len(L):arr[k] = L[i]i += 1k += 1while j < len(R):arr[k] = R[j]j += 1k += 1return arr

5. 快速排序 (Quick Sort)

def quick_sort(arr):if len(arr) <= 1:return arrpivot = 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 quick_sort(left) + middle + quick_sort(right)

6. 堆排序 (Heap Sort)

def heapify(arr, n, i):largest = i  # 假设当前节点是最大值l = 2 * i + 1  # 左子节点r = 2 * i + 2  # 右子节点# 如果左子节点存在且大于当前节点if l < n and arr[i] < arr[l]:largest = l# 如果右子节点存在且大于当前最大值if r < n and arr[largest] < arr[r]:largest = r# 如果最大值不是当前节点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]  # 交换heapify(arr, i, 0)return arr

7. 希尔排序 (Shell Sort)

def shell_sort(arr):n = len(arr)gap = n // 2while gap > 0:for i in range(gap, n):temp = arr[i]j = i# 插入排序while j >= gap and arr[j - gap] > temp:arr[j] = arr[j - gap]j -= gaparr[j] = tempgap //= 2return arr

8. 计数排序 (Counting Sort)

def counting_sort(arr):max_val = max(arr)m = max_val + 1count = [0] * m# 统计每个元素的个数for a in arr:count[a] += 1i = 0for a in range(m):for c in range(count[a]):arr[i] = ai += 1return arr

9. 基数排序 (Radix Sort)

def counting_sort_for_radix(arr, exp):n = len(arr)output = [0] * ncount = [0] * 10# 统计每个基数的个数for i in range(n):index = arr[i] // expcount[index % 10] += 1for i in range(1, 10):count[i] += count[i - 1]i = n - 1while i >= 0:index = arr[i] // expoutput[count[index % 10] - 1] = arr[i]count[index % 10] -= 1i -= 1for i in range(n):arr[i] = output[i]def radix_sort(arr):max_val = max(arr)exp = 1while max_val // exp > 0:counting_sort_for_radix(arr, exp)exp *= 10return arr

10. 桶排序 (Bucket Sort)

def bucket_sort(arr):if len(arr) == 0:return arrbucket = []slot_num = 10  # 桶的数量for i in range(slot_num):bucket.append([])# 将元素分配到不同的桶中for j in arr:index = int(slot_num * j)bucket[index].append(j)# 对每个桶中的元素进行排序for i in range(slot_num):bucket[i] = insertion_sort(bucket[i])k = 0for i in range(slot_num):for j in range(len(bucket[i])):arr[k] = bucket[i][j]k += 1return arr

11. Tim Sort (Tim Sort)

MIN_MERGE = 32def calc_min_run(n):r = 0while n >= MIN_MERGE:r |= n & 1n >>= 1return n + rdef insertion_sort_for_timsort(arr, left, right):for i in range(left + 1, right + 1):temp = arr[i]j = i - 1while j >= left and arr[j] > temp:arr[j + 1] = arr[j]j -= 1arr[j + 1] = tempdef merge_for_timsort(arr, l, m, r):len1, len2 = m - l + 1, r - mleft, right = [], []for i in range(0, len1):left.append(arr[l + i])for i in range(0, len2):right.append(arr[m + 1 + i])i, j,

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优雅的不等式——Hard

上一文《Easy》末尾出现了又要我们证明的例子&#xff0c;Hard难度就是继续答题答下去 其实一样可以用那篇文章https://zhuanlan.zhihu.com/p/669285539中的式子继续算下去&#xff0c;但是有三个系数&#xff0c;实在是太费时间和人力了 翻到下面的第十九种类型&#xff0c;可…

虚拟局域网PPTP配置与验证(二)

虚拟局域网PPTP配置与验证(二) windows VPN客户端linux 客户端openwrt客户端性能验证虚拟局域网PPTP配置与验证(一)虚拟局域网PPTP配置与验证(二) : 本文介绍几种客户端连接PPTP服务端的方法,同时对linux/windows/openwrt 操作系统及x86、arm硬件平台下PPTP包转发性能进…

Move 合约部署踩坑笔记:如何解决 Sui 客户端发布错误Committing lock file

Move 共学活动&#xff1a;快速上手 Move 开发 为了帮助更多开发者快速了解和掌握 Move 编程语言&#xff0c;Move 共学活动由 HOH 社区、HackQuest、OpenBuild、KeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台&#xff0c;带领大家一步步熟悉 Move 语言&#…

介绍一下strupr(arr);(c基础)

hi , I am 36 适合对象c语言初学者 strupr(arr)&#xff1b;函数是把arr数组变为大写字母 格式 #include<string.h> strupr(arr); 返回值为arr 链接分享一下arr的意义(c基础)(必看)(牢记)-CSDN博客 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl…

进程间通信5:信号

引入 我们之前学习了信号量&#xff0c;信号量和信号可不是一个东西&#xff0c;不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的&#xff0c;无法预测信号可以临时保存下来&#xff0c;之后再处理信号是异步发送的…

浅谈网络 | 传输层之套接字Socket

目录 基于 TCP 协议的 Socket 程序调用过程基于 UDP 协议的 Socket 程序函数调用过程服务器如何接入更多的项目构建高并发服务端&#xff1a;从多进程到 IO 多路复用 在前面&#xff0c;我们已经介绍了 TCP 和 UDP 协议&#xff0c;但还没有实践过。接下来这一节&#xff0c;我…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

FileLink内外网文件共享系统与FTP对比:高效、安全的文件传输新选择

随着信息技术的不断进步&#xff0c;文件传输和共享已经成为企业日常工作中不可或缺的一部分。传统的FTP&#xff08;File Transfer Protocol&#xff09;协议在一定程度上为文件共享提供了便利&#xff0c;但随着企业对文件传输的需求越来越复杂&#xff0c;FileLink内外网文件…

神经网络归一化方法总结

在深度学习中&#xff0c;归一化 是提高训练效率和稳定性的关键技术。以下是几种常见的神经网络归一化方法的总结&#xff0c;包括其核心思想、适用场景及优缺点。 四种归一化 特性Batch NormalizationGroup NormalizationLayer NormalizationInstance Normalization计算维度…

ORB-SLAM2源码学习:Initializer.cc:Initializer::ComputeF21地图初始化——计算基础矩阵

前言 在平面场景我们通过求解单应矩阵H来求解位姿&#xff0c;但是我们在实际中常见的都是非平面场景&#xff0c; 此时需要用基础矩阵F求解位姿。 1.函数声明 cv::Mat Initializer::ComputeF21(const vector<cv::Point2f> &vP1, const vector<cv::Point2f>…

离散化 C++

题目 解题思路 将所有对坐标的访问用map映射到一个新的坐标轴上再在新的坐标轴上进行加法用前缀和快速求出区间的和 代码实现 #include<iostream> #include<algorithm> #include<unordered_map>using namespace std;typedef pair<int, int> PII;con…

uniop触摸屏维修eTOP40系列ETOP40-0050

在现代化的工业与商业环境中&#xff0c;触摸屏设备已成为不可或缺的人机交互界面。UNIOP&#xff0c;作为一个知名的触摸屏品牌&#xff0c;以其高性能、稳定性和用户友好性&#xff0c;广泛应用于各种自动化控制系统、自助服务终端以及高端展示系统中。然而&#xff0c;即便如…

机器学习与图像处理中上采样与下采样

一、机器学习中的上采样 目的&#xff1a;在机器学习中&#xff0c;上采样用于处理不平衡数据集&#xff0c;即某些类别的样本数量远多于其他类别。上采样的目标是通过增加少数类样本的数量来平衡类别分布&#xff0c;从而提高模型对少数类的识别能力。 1.随机过采样&#xff0…

Unity中动态生成贴图并保存成png图片实现

实现原理&#xff1a; 要生成长x宽y的贴图&#xff0c;就是生成x*y个像素填充到贴图中&#xff0c;如下图&#xff1a; 如果要改变局部颜色&#xff0c;就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理&#xff0c; 或者要想做圆形就是计算距某个点&#xff08;x1,y1&…

DHCP服务(包含配置过程)

目录 一、 DHCP的定义 二、 使用DHCP的好处 三、 DHCP的分配方式 四、 DHCP的租约过程 1. 客户机请求IP 2. 服务器响应 3. 客户机选择IP 4. 服务器确定租约 5. 重新登录 6. 更新租约 五、 DHCP服务配置过程 一、 DHCP的定义 DHCP&#xff08;Dynamic Host Configur…

认识RabbitMq和RabbitMq的使用

1 认识RabbitMq RabbitMQ是⼀个消息中间件&#xff0c;也是⼀个生产者消费者模型&#xff0c;它负责接收&#xff0c;存储并转发消息。 2.1 Producer和Consumer Producer&#xff1a;生产者&#xff0c;是RabbitMQServer的客户端&#xff0c;向RabbitMQ发送消息 Consumer&…

HTML飞舞的爱心

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色…

Excel把其中一张工作表导出成一个新的文件

excel导出一张工作表 一个Excel表里有多个工作表&#xff0c;怎么才能导出一个工作表&#xff0c;让其生成新的Excel文件呢&#xff1f; 第一步&#xff1a;首先打开Excel表格&#xff0c;然后选择要导出的工作表的名字&#xff0c;比如“Sheet1”&#xff0c;把鼠标放到“She…

Redis-09 SpringBoot集成Redis

Jedis 和 lettuce 基本已经过时 集成RedisTemplate 单机 1.建 Modul 2.改pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

git 命令之只提交文件的部分更改

git 命令之只提交文件的部分更改 有时&#xff0c;我们在一个文件中进行了多个更改&#xff0c;但只想提交其中的一部分更改。这时可以使用 使用 git add -p 命令 Git add -p命令允许我们选择并添加文件中的特定更改。它将会显示一个交互式界面&#xff0c;显示出文件中的每个更…