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.rhkb.cn/news/281915.html

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

相关文章

linux之shell脚本基础

1.构建基础脚本 1.1 创建shell脚本 1.1.1 第一行需要指定使用的shell # 用作注释行.shell并不会处理脚本中的注释行,但是第一行的注释,会告诉shell使用哪个shell来运行脚本. #!/bin/bash 1.1.2 让shell找到你的脚本 直接运行脚本会提示-bash: a.sh: command not found.因…

Selenium 自动化 —— Selenium IDE录制、回放、导出Java源码

Hello Selenium 示例 之前我们在专栏的第一篇文章中演示了使用使用Selenium进行百度搜索的Hello world示例。 代码不复杂非常简单&#xff1a; public static void main(String[] args) {WebDriver driver null;try {// 设置Chrome驱动的路径 // System.setPro…

Javaweb学习记录(三)请求响应案例

下面为一个请求响应案例&#xff0c;postman发送请求&#xff0c;服务器响应将一个xml文件中的数据通过读取解析&#xff0c;将其用Result类标准的格式返回前端&#xff0c;在前端用json的方式显示 后端Controller代码 1、通过本类的字节码文件得到类加载器并寻找到需要解析的…

如何使用 ArcGIS Pro 生成TIN

三角网是一种常用于表示地表地形的数字地球模型&#xff08;DEM&#xff09;方式&#xff0c;我们可以通过 ArcGIS Pro 将等高线和高程点转换为TIN&#xff0c;这里为大家介绍一下转换方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的高…

MATLAB环境下基于振动信号的轴承状态监测和故障诊断

故障预测与健康管理PHM分为故障预测和健康管理与维修两部分&#xff0c;PHM首先借助传感器采集关键零部件的运行状态数据&#xff0c;如振动信号、温度图像、电流电压信号、声音信号及油液分析等&#xff0c;提取设备的运行监测指标&#xff0c;进而实现对设备关键零部件运行状…

python 爬取杭州小区挂牌均价

下载chrome驱动 通过chrome浏览器的 设置-帮助-关于Google Chrome 查看你所使用的Chrome版本 驱动可以从这两个地方找: 【推荐】https://storage.googleapis.com/chrome-for-testing-publichttp://npm.taobao.org/mirrors/chromedriver import zipfile import os import r…

前端面试拼图-知识广度

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录并添加部分可参考的文档&#xff0c;如下... 1. 移动端H5 click有300ms延迟&#xff0c; 如何解决&#xff1f; 背景&#xff1a;double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…

【地图】腾讯地图 - InfoWindow 自定义信息窗口内容时,内容 html 嵌套混乱问题

目录 需求描述问题问题代码页面展示 解决原因解决办法解决代码页面展示 代码汇总注 需求描述 腾讯地图上画点位&#xff0c;点击点位展示弹框信息 问题 问题代码 // 打开弹框 openInfoWindow(position, content) {this.infoWindow new TMap.InfoWindow({map: this.map,posit…

当内外网的域名相同时,如何在外网解析同域名的网址

当内部网络和外部网络存在相同的域名&#xff0c;并且希望内部用户通过内部DNS服务器解析到外部网络上的该域名对应的公网IP地址时&#xff0c;需要在内部DNS服务器上采取一些特殊配置策略来实现这一目标。以下是一种通用的解决方案&#xff1a; 条件转发&#xff08;Condition…

初识GO语言

是由google公司推出的一门编程语言&#xff0c;12年推出的第一个版本 Go的特点 Go为什么能在最近的IT领域炙手可热 集python简洁&C语言的性能于一身 21世纪的C语言 顺应容器化时代的到来 区块链的崛起 学习一门编程语言可以划分为下面这三个步骤 安装 编译器 or 解…

使用华为云HECS服务器+nodejs开启web服务

简介: 在华为云HECS服务器上使用nodejs开启一个web服务。 目录 1.开通华为云服务器 2.远程登录 2.1 使用华为官方的网页工具登录 ​编辑 2.2 使用MobaXterm登录 3 安装node 3.1 下载 2. 配置环境变量 4. 安装express模块 5.开启外网访问 1.开通华为云服务器 这…

《大模型对齐方法》最新综述

源自&#xff1a;专知 “人工智能技术与咨询” 发布 大模型在人工智能领域取得了革命性的突破&#xff0c;但它们也可能带来潜在的担忧。为了解决这些担忧&#xff0c;引入了对齐技术&#xff0c;以使这些模型遵循人类的偏好和价值观。尽管过去一年取得了相当大的进展&#…

怎么做好独立站的SEO优化

随着全球贸易的蓬勃发展&#xff0c;越来越多的企业开始关注外贸市场&#xff0c;并将目光投向了外贸网站。然而&#xff0c;在竞争激烈的外贸市场中&#xff0c;如何写出吸引人的文章&#xff0c;以及如何优化网站以在搜索引擎中脱颖而出&#xff0c;成为了外贸独立网站必须面…

如何与手机共享笔记本电脑的互联网?这里提供详细步骤

这篇文章介绍了如何通过将手机变成Wi-Fi热点来与手机共享笔记本电脑的互联网连接。 如何共享笔记本电脑的互联网连接 你可以通过Wi-Fi或有线共享笔记本电脑的数据连接,具体取决于你的设置。 Windows Windows允许你通过ICS共享你的互联网连接。ICS,或称互联网连接共享,是W…

【Godot 4.2】常见几何图形、网格、刻度线点求取函数及原理总结

概述 本篇为ShapePoints静态函数库的补充和辅助文档。ShapePoints函数库是一个用于生成常见几何图形顶点数据&#xff08;PackedVector2Array&#xff09;的静态函数库。生成的数据可用于_draw和Line2D、Polygon2D等进行绘制和显示。因为不断地持续扩展&#xff0c;ShapePoint…

【创建进程】fork函数与写时拷贝

文章目录 fork函数fork如何返回两个值&#xff08;fork的工作原理&#xff09;如何解释父子进程相互输出printf 写时拷贝 fork函数 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 fork函…

LiveGBS流媒体平台GB/T28181功能-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播

LiveGBS支持-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播 1、轮播功能2、分屏展示3、选择轮播通道4、配置轮播间隔(秒)5、点击开始轮播6、轮播停止及全屏7、搭建GB28181视频直播平台 1、轮播功能 视频监控项目使用过程中&#xff0c;有时需要大屏…

Java 模拟Spring,实现IOC和AOP的核心(一)

在这里我要实现的是Spring的IOC和AOP的核心&#xff0c;而且有关IOC的实现&#xff0c;注解XML能混合使用&#xff01; 参考资料&#xff1a; IOC&#xff1a;控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;&#xff0c;是面向对象编程中的一种…

OpenLayers基础教程——使用WebGL加载海量数据(1)

1、前言 最近遇到一个问题&#xff1a;如何在OpenLayers中高效加载海量的场强点&#xff1f;由于项目中的一些要求&#xff0c;不能使用聚合的方法加载。一番搜索之后发现&#xff1a;OpenLayers中有一个WebGLPoints类&#xff0c;使用该类可以轻松应对几十万的数据量&#xf…

3D高斯泼溅的崛起

沉浸式媒体领域正在以前所未有的速度发展&#xff0c;其中 3D 高斯溅射成为一项关键突破。 这项技术在广泛的应用中看起来非常有前景&#xff0c;并且可能会彻底改变我们未来创建数字环境以及与数字环境交互的方式。 在本文中&#xff0c;我们将通过与摄影测量和 NeRF 等前辈进…