LeetCode讲解算法1-排序算法(Python版)

文章目录

  • 一、引言
    • 问题提出
  • 二、排序算法
    • 1.选择排序(Selection Sort)
    • 2.冒泡排序
    • 3.插入排序(Insertion Sort)
    • 4.希尔排序(Shell Sort)
    • 5.归并排序(Merge Sort)
    • 6.快速排序(Quick Sort)
    • 7.堆排序(Heap Sort)


一、引言

问题提出

  给你一个整数数组 nums,请你将该数组升序排列。

示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]

二、排序算法

1.选择排序(Selection Sort)

  工作原理,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。算法复杂度O(n^2)

class Solution:def sortArray(self, nums: List[int]) -> List[int]:# selection sort n = len(nums)for i in range(n):for j in range(i,n):if nums[i] > nums[j]:nums[i],nums[j] = nums[j],nums[i]#print(nums)return nums

2.冒泡排序

  冒泡排序时针对相邻元素之间的比较,可以将大的数慢慢“沉底”(数组尾部)。左边大于右边交换一趟排下来最大的在右边。算法复杂度O(n^2)

def bubble_sort(nums):n = len(nums)# 进行多次循环for c in range(n):for i in range(1, n - c):#一轮排好一个。故是n-cif nums[i - 1] > nums[i]:nums[i - 1], nums[i] = nums[i], nums[i - 1]return nums

3.插入排序(Insertion Sort)

  (打扑克抓牌,放入合适位置):每次将无序区第一个值与有序区作比较,选择合适的插入位置。从有序区最后一个值开始比较,满足条件则进行交换,不断逼近最合适的插入位置。因为在有序区域插入了一个值,所以有序区比待插入值大的值索引都后移了一位。。算法复杂度O(n^2)

class Solution:def sortArray(self, nums: List[int]) -> List[int]:# insert sort n = len(nums)for i in range(1,n):#从前面排序好的数组找到位置while i > 0 and nums[i-1] > nums[i]:nums[i-1],nums[i] = nums[i],nums[i-1]i -= 1return nums
class Solution:def sortArray(self, nums: List[int]) -> List[int]:for i in range(1,len(nums)):tmp=nums[i]                 # 待插入位置的值,即无序区第一位的值j=i-1                       # 指针指向待插入位置左边的值,即有序区最后一位while tmp<nums[j] and j>-1: # 待插入的值与指针位置的值作比较,更小则插入nums[j+1]=nums[j]nums[j]=tmpj-=1                    # 指针左移,将待插入值与更小的值作比较,不断逼近最合适的插入位置return nums     

4.希尔排序(Shell Sort)

  插入排序进阶版。的执行思路是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤,直到增量到达1。

def shell_sort(nums):n = len(nums)gap = n // 2while gap:for i in range(gap, n):while i - gap >= 0 and nums[i - gap] > nums[i]:nums[i - gap], nums[i] = nums[i], nums[i - gap]i -= gapgap //= 2return nums

5.归并排序(Merge Sort)

  归并排序,采用是分治法,先将数组分成子序列,让子序列有序,再将子序列间有序,合并成有序数组。时间复杂度:O(nlogn)。

def merge_sort(nums):if len(nums) <= 1:return numsmid = len(nums) // 2# 分left = merge_sort(nums[:mid])right = merge_sort(nums[mid:])# 合并return merge(left, right)def merge(left, right):res = []i = 0j = 0while i < len(left) and j < len(right):if left[i] <= right[j]:res.append(left[i])i += 1else:res.append(right[j])j += 1res += left[i:]res += right[j:]return res

6.快速排序(Quick Sort)

  快速排序是选取一个“哨兵”(pivot),将小于pivot放在左边,把大于pivot放在右边,分割成两部分,并且可以固定pivot在数组的位置,在对左右两部分继续进行排序。

  快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  • 步骤1:从数列中挑出一个元素,称为 “基准”(pivot );
  • 步骤2:重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 步骤3:递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
def quickSort(nums):if len(nums) >= 2:mid = nums[len(nums) // 2]nums.remove(mid)low = []high = []for num in nums:if num <= mid:high.append(num)else:low.append(num)return quickSort(high) + [mid] + quickSort(low)else:return numsnums=[3,4,1,5,7]
print(quickSort(nums))
import randomdef partition(left, right, nums):tmp = nums[left]while left < right:while left < right and nums[right] >= tmp:right -= 1nums[left] = nums[right] #while left < right and nums[left] <= tmp:left += 1nums[right] = nums[left]    nums[left] = tmp    return leftdef quick_sort(left,right, nums):"左右两侧,各自有序"if left < right:mid = partition(left, right, nums)quick_sort(left, mid-1, nums)quick_sort(mid + 1, right, nums)return numsif __name__ == "__main__":nums = [i for i in range(10)]random.shuffle(nums)print(nums)print(quick_sort(0, len(nums)-1, nums))

7.堆排序(Heap Sort)

  完全二叉树:
  叶子节点只能出现在最下层和次下层,并且最下面一层的节点都集中在该层最左边的若干位置的二叉树。
  堆:一种特殊的完全二叉树结构
  大根堆:一颗完全的二叉树,满足任意节点都比其他孩子节点大
  小根堆:一颗完全的二叉树,满足任意节点都比其他孩子节点小

import random#大根堆
def sift(nums, low, high):"""向下调整"""i = low  # 当前根节点j = 2 * i + 1   # 根节点对应的左孩子tmp = nums[low]while j <= high:if j+1 <= high and nums[j+1] > nums[j]: # 如果右孩子存在且大于左孩子,那么指针指向右孩子j = j+1  if nums[j] > tmp: # 如果大孩子比根节点大,则右孩子赋给根节点,指针再向下看一层nums[i] = nums[j]i = jj = 2 * i + 1else: # 大孩子<根节点,跳出nums[i] = tmp #tmp放在某一级领导位置上break   else:         # 把tmp放在叶子节点上nums[i] = tmp        def heap_sort(nums):"""建堆,农村包围城市,从堆的下面逐步调用sift"""n = len(nums)for i in range((n-1-1)//2, -1, -1): # 从最后一个根节点开始调整sift(nums, i, n-1)for i in range(n-1, -1, -1):  # 从小到大输出nums[0], nums[i] = nums[i], nums[0]sift(nums, 0, i-1)return numsif __name__ == "__main__":nums = [_ for _ in range(20)]random.shuffle(nums)print(nums)print(heap_sort(nums))

在这里插入图片描述

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

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

相关文章

【Node.js从基础到高级运用】十三、NodeJS中间件高级应用

在现代web开发中&#xff0c;Node.js因其高效和灵活性而备受青睐。其中&#xff0c;中间件的概念是构建高效Node.js应用的关键。在这篇博客文章中&#xff0c;我们将深入探讨Node.js中间件的高级应用&#xff0c;包括创建自定义中间件、使用第三方中间件等。我们将从基础讲起&a…

AJAX-原理XMLHttpRequest

定义 使用 查询参数 定义&#xff1a;浏览器提供给服务器的额外信息&#xff0c;让服务器返回浏览器想要的数据 语法&#xff1a;http://xxxx.com/xxx/xxx?参数名1值1&参数名2值2

ChatGPT编程Python小案例(拿来就用)—解压zip压缩文件

ChatGPT编程Python小案例&#xff08;拿来就用&#xff09;—解压zip压缩文件 今天撸一本书&#xff0c;其中书中提供一个zip压缩文件的资料。下载之后&#xff0c;没有解压软件&#xff0c;&#xff08;也可能该文件可以自解压&#xff09;。这段时间已经深刻体会到AI编程带来…

爬虫 Day2

resp.close()#关掉resp 一requests入门 &#xff08;一&#xff09; 用到的网页&#xff1a;豆瓣电影分类排行榜 - 喜剧片 import requestsurl "https://movie.douban.com/j/chart/top_list" #参数太长&#xff0c;重新封装参数 param {"type": "…

【Unity每日一记】unity中的内置宏和条件编译(Unity内置脚本符号)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

EDI在汽车主机厂配送流程中的应用

汽车主机厂的汽车配送流程始于汽车 “生产结束 ” &#xff0c;止于 “交付给经销商 ” 。在这个流程中&#xff0c;企业作为主机厂的下游供应商&#xff0c;与主机厂的物流服务供应商之间的信息交换将会变得十分重要。 配送流程&#xff1a;运输订单以及报告 汽车主机厂提供预…

【linux驱动】定时器的使用

【linux驱动】定时器的使用 文章目录 【linux驱动】定时器的使用1.介绍1.1相关名词1.2配置HZ的方法 2.API3.示例4.调试 1.介绍 1.1相关名词 HZ、jiffies、tick Linux系统启动后&#xff0c;每隔固定周期就会发出timer interrupt(IRQ 0)&#xff0c;HZ用来定义每一秒发生多少…

【机器学习】经典目标检测算法:RCNN、Fast RCNN、 Faster RCNN 基本思想和网络结构介绍

文章目录 三者的比较&#xff1a;RCNN、Fast RCNN、 Faster RCNN一、框架的对比1.三者都是二阶算法&#xff0c;网络框架比较&#xff1a;2.三者的优缺点比较&#xff1a; RCNN一、RCNN系列简介二、RCNN算法流程的4个步骤三、RCNN存在的问题四、论文解析补充1.R-CNN提出了两个问…

Odoo17免费开源ERP开发技巧:如何在表单视图中调用JS类

文/Odoo亚太金牌服务开源智造 老杨 在Odoo最新V17新版中&#xff0c;其突出功能之一是能够构建个性化视图&#xff0c;允许用户以独特的方式与数据互动。本文深入探讨了如何使用 JavaScript 类来呈现表单视图来创建自定义视图。通过学习本教程&#xff0c;你将获得关于开发Odo…

放慢音频速度的三个方法 享受慢音乐

如何让音频慢速播放&#xff1f;我们都知道&#xff0c;在观看视频时&#xff0c;我们可以选择快进播放&#xff0c;但是很少有软件支持慢速播放。然而&#xff0c;将音频慢速播放在某些情况下是非常必要的。例如&#xff0c;当我们学习一门新语言时&#xff0c;我们可以将音频…

Pytorch详细应用基础(全)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.安装pytorch以及anaconda配置 尽量保持默认的通道&#xff0c;每次写指令把镜像地址写上就行。 defaults优先级是最低的&#…

深度学习神经网络相关记录《二》

如何判断模型是一个好模型&#xff1f; 模型预测效果&#xff0c;也就是模型预测的准确率运算速度&#xff1b;能够处理大量数据、短时间内急速学习、可以实时进行预测&#xff0c;是机器学习的重要优势&#xff1b;可解释性&#xff1b;深度学习已经不太关系这一点了&#xf…

基础:TCP三次握手做了什么,为什么要握手?

1. TCP 三次握手在做些什么 1. 第一次握手 &#xff1a; 1&#xff09;握手作用&#xff1a;客户端发出建立连接请求。 2&#xff09;数据处理&#xff1a;客户端发送连接请求报文段&#xff0c;将SYN位置为1&#xff0c;Sequence Number为x;然后&#xff0c;客户端进入SYN_S…

基于Matlab的视频人面检测识别,Matalb实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

分布式(计算机算法)

目录 分布式计算 分布式​编辑 分布式和集群 分布式和集群的应用场景 分布式应用场景 集群应用场景 哪种技术更优、更快、更好呢 性能 稳定性 以下概念来源于百度百科 分布式计算 分布式计算是近年提出的一种新的计算方式。所谓分布式计算就是在两个或多个软件互相共享信息…

【uniapp】uniapp设置改变全局字体大小功能:

文章目录 一、效果&#xff1a;二、文档&#xff1a;三、案例&#xff1a;引用插件&#xff0c;将项目中的字体单位rpx换成rem&#xff0c;结合官网提供的page-meta属性&#xff0c;通过控制根字体大小&#xff0c;达到调节字体大小要求。 一、效果&#xff1a; 二、文档&#…

代码随想录算法训练营第46天 | 完全背包,139.单词拆分

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 完全背包理论基础&#xff1a; https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9…

全网最全的幻兽帕鲁服务器搭建教程——阿里云保姆级教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

DVWA靶场-SQL InjectionSQL注入

SQL Injection&#xff08;SQL注入&#xff09;概念 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。具体来说&#xff0c;它是利用现有应用程序&#xff0c;将&#xff08;恶意&#xff09;的SQL命令注…

YOLOv2学习

YOLOv2学习 Anchor boxes 和 bounding boxes 的区别锚框&#xff08;Anchor Boxes&#xff09;边界框&#xff08;Bounding Boxes&#xff09;锚框与边界框的区别 摘要引言数据集组合方法&#xff08;Dataset Combination Method&#xff09;联合训练算法&#xff08;Joint Tra…