【Leetcode】八大排序

总述

插入排序:直接插入排序;希尔排序;

选择排序:简单选择排序;堆排序;

交换排序:冒泡排序;快速排序;

归并排序;

桶排序/基数排序;

 直接插入排序

选取未排序区域的第一个元素,从后至前逐个与已排序区域的元素两两比较,若arr[i-1]>arr[i](前者大),交换arr[i-1]和arr[i],i-=1;需要保证已排序区域再加入这个元素后仍然有序——打扑克;

时间复杂度:最优O(n)--满足排序要求  最坏O(n^2)--与排序要求相反

空间复杂度:O(1)--原地实现

稳定性:稳定

def insertion_sort(arr):length = len(arr)if length <= 1:returnfor i in range(length):cur_index = iwhile cur_index-1 >= 0 and arr[cur_index-1] > arr[cur_index]:arr[cur_index], arr[cur_index-1] = arr[cur_index-1], arr[cur_index]cur_index -= 1return arr
希尔排序-缩小增量排序

通过比较一定间隔的元素进行插入排序,同时不断缩小间隔(增量),直到比较相邻元素。当增量为0时,算法终止。

时间复杂度:依赖于gap的选择,平均复杂度O(n^1.5)

空间复杂度:O(1)--原地实现

稳定性:不稳定

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

搜索未排序区域的最小值(最大值),将其交换到已排序区域的末尾,然后扩大已排序范围,直至得到升序(降序)排列;

时间复杂度:O(n^2)

空间复杂度:O(1)--原地实现

稳定性:不稳定

def select_sort(arr):length = len(arr)if length <= 1:returnfor i in range(length):min_index = ifor j in range(i+1, length):if arr[min_index] > arr[j]:min_index = jif min_index != i:arr[min_index], arr[i] = arr[i], arr[min_index]
 堆排序

 通过数据上浮构造初始大根堆,然后将最大值与最后一个数交换,通过数据下沉恢复除最后一个节点的大根堆,实现倒序构造升序数组;

时间复杂度:O(nlogn)

空间复杂度:O(1)--原地实现

稳定性:不稳定

def heapify(arr, index, end):while True:left, right = 2*idx+1, 2*idx+2if right < end: cur = left if nums[left]>nums[right] else rightelif left < end: cur = leftelse: breakif nums[cur]>nums[idx]:nums[cur], nums[idx] = nums[idx], nums[cur]idx = curelse:breakreturndef heap_sort(arr):n = len(arr)for i in range(n//2, -1, -1):heapify(arr, i, n)for i in range(n-1, 0, -1):arr[0], arr[i] = arr[i], arr[0]heapify(arr, 0, i)   # 调整边界return arr
冒泡排序

对未排序区域的元素两两比较,将较大值(较小值)向后交换,然后缩小未排序范围,直至未排序范围清空时得到升序(降序)排列;

时间复杂度:最优O(n)--满足排序要求  最坏O(n^2)--与排序要求相反

空间复杂度:O(1)--原地实现

稳定性:稳定

def bubble_sort(arr):length = len(arr)if length <= 1:returnfor i in range(length):is_made_swap = False               # 设置标志位for j in range(length - i - 1):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]is_made_swap = Trueif not is_made_swap: break         # 无交换代表已经有序
快速排序

step1.从数列中挑出一个元素,称为"基准"(pivot),
step2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
step3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

时间复杂度:最优O(nlogn)--每次接近二分  最坏O(n^2)--每次只分出一个

空间复杂度:O(logn)

稳定性:不稳定

def partition(nums, left, right):pivot = nums[left]                 #初始化一个待比较数据i,j = left, rightwhile i<j:while(i<j and nums[j]>=pivot): #从后往前查找,直到找到一个比pivot更小的数j-=1nums[i] = nums[j]              #将更小的数放入左边while(i<j and nums[i]<=pivot): #从前往后找,直到找到一个比pivot更大的数i+=1nums[j] = nums[i]              #将更大的数放入右边nums[i] = pivot                    #待比较数据放入最终位置 return i                           #返回待比较数据最终位置def quicksort(nums, left, right):if left < right:index = partition(nums, left, right)quicksort(nums, left, index-1)quicksort(nums, index+1, right)
归并排序

把长度为n的输入序列分成两个长度为n/2的子序列,在子序列中也采用归并排序;当子序列中排序完成后,将其合并;

时间复杂度:最优O(n)   最坏O(nlogn)

空间复杂度:O(n)

稳定性:不稳定

def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2    left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)   def merge(left, right):new = []i = j = k = 0while(i < len(left) and j < len(right)):if left[i] < right[j]:new.append(left[i])i += 1else:new.append(right[j])j += 1new = new + left[i:] + right[j:]return new
 桶排序/基数排序

将数据按位进行分桶,按桶代表的数值进行排序,然后切换到下一个位;

def radix_sort(arr):max_num = max(arr)place = 1while max_num >= 10**place:  # 统计最大值的位数place += 1for i in range(place):buckets = [[] for _ in range(10)]for num in array:radix = int(num/(10**i) % 10)buckets[radix].append(num)j = 0for k in range(10):for num in buckets[k]:arr[j] = numj += 1return arr

备注:

冒泡排序和选择排序大体思路一致,区别在于冒泡是通过交换都得到未排序区域的最值,而选择只记录了对应下标;冒泡的有序区域在列表末尾,选择的有序区域在列表开头(这个也可换);冒泡比较出相对关系,可在满足要求时提前结束排序,而选择无法优化;

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

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

相关文章

【软件工程】期末复习超全整理!!!

软件工程期末复习整理 软件工程大纲以及阅读说明用例图用例图例题1 用例文档用例文档例题1用例文档例题2 活动图活动图例题1活动图例题2活动图例题3 类图类图中的关系类图例题1类图例题2 顺序图顺序图例题1顺序图 例题2顺序图例题3顺序图--分析类顺序图例题4顺序图例题5 状态图…

重学java 33.API 4.日期相关类

任何事&#xff0c;必作于细&#xff0c;也必成于实 —— 24.5.9 一、Date日期类 1.Date类的介绍 1.概述: 表示特定的瞬间,精确到亳秒 2.常识: a.1000毫秒 1秒 b.时间原点:1970年1月1日 0时0分0秒(UNIX系统起始时间),叫做格林威治时间,在0时区上 c.时区:北京位于东八区,一个时区…

模拟实现链表的功能

1.什么是链表&#xff1f; 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 单向或者双向 带头或者不带头 …

车载测试到底怎么样?真实揭秘!

什么是车载智能系统测试&#xff1f; 车载智能系统&#xff0c;是汽车智能化重要的组成部分&#xff0c;由旧有的车载资通讯系统结合联网汽车技术所演进而来&#xff0c;随着软硬件技术的不断进步&#xff0c; 让车载智能系统拥有强大的运算能力及多元化的应用功能。 车载智能…

苹果iPad M4:Console级别图形和AI强大功能

苹果iPad M4&#xff1a;Console级别图形和AI强大功能 Apple近日发布了最新的M4芯片&#xff0c;旨在为iPad Pro系列带来明显的性能提升和电池续航时间延长。在本篇报道中&#xff0c;我们将详细介绍M4芯片的特点、性能改进和为创意专业人士带来的影响。 M4芯片的强大功能 …

图解项目管理必备十大管理模型及具体应用建议

心智模型是根深蒂固存在于人们心中&#xff0c;影响人们如何理解这个世界&#xff08;包括我们自己、他人、组织和整个世界&#xff09;&#xff0c;以及如何采取行动的诸多假设、成见、逻辑、规则&#xff0c;甚至图像、印象等。本图通过对心智模型的分类和描述&#xff0c;表…

【Linux】shell基础,shell脚本

Shell Shell是一个用C语言编写的程序&#xff0c;接受用户输入的命令&#xff0c;并将其传递给操作系统内核执行。Shell还负责解释和执行命令、管理文件系统、控制进程&#xff0c;是用户使用Linux的桥梁。Shell既是一种命令语言&#xff0c;又是一种程序设计语言 Shell脚本 Sh…

上位机图像处理和嵌入式模块部署(树莓派4b和c++新版本的问题)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 自己读书的时候是03年&#xff0c;学习c也是差不多04年开始&#xff0c;到现在基本上20年了。这20年过程当中&#xff0c;其实c的语言版本一直是在…

【stomp 实战】spring websocket 接收消息源码分析

后台消息的发送过程&#xff0c;我们通过spring websocket用户消息发送源码分析已经了解了。我们再来分析一下后端接收消息的过程。这个过程和后端发送消息过程有点类似。 前端发送消息 前端发送消息给服务端的示例如下&#xff1a; 发送给目的/app/echo一个消息。 //主动发…

科林算法_3 图

一、图论基础 多对多的关系 定义&#xff1a;G(V,E) Vertex顶点 Edge边 顶点的集合V{v1,v2} 边的结合E{(v1,v2)} 无向图(1,2) 有向图<1,2> 依附&#xff1a;边(v1,v2)依附于顶点v1,v2 路径&#xff1a;&#xff08;v1,v2)(v2,v3) 无权路径最短&#xff1a;边最少…

程序员不会告诉老板的那些神器

目录 1. 持续集成工具&#xff1a;CruiseControl&#xff08;简称CC&#xff09; 2. 代码风格、质量检查工具&#xff1a;StyleCop 3.AI工具 3.1 AI助力编写开发日报 3.2 AI助力编写普适性代码 3.3 AI助力生成代码注释 3.4 AI助力重构代码去掉“坏味道” 3.5 AI助力…

【小白的大模型之路】基础篇:Transformer细节

基础篇&#xff1a;Transformer 引言模型基础架构原论文架构图EmbeddingPostional EncodingMulti-Head AttentionLayerNormEncoderDecoder其他 引言 此文作者本身对transformer有一些基础的了解,此处主要用于记录一些关于transformer模型的细节部分用于进一步理解其具体的实现机…

渗透之sql注入---宽字节注入

目录 宽字节注入原理&#xff1a; 实战&#xff1a; 源码分析&#xff1a; 开始注入&#xff1a; 找注入点&#xff1a; 注入数据库名&#xff1a; 注入表名&#xff1a; 注入列明&#xff1a; 注入具体值&#xff1a;http://sqli-labs:8084/less-32/?id-1%df%27unio…

luceda ipkiss教程 66:金属线的钝角转弯

案例分享&#xff1a;金属线的135度转弯&#xff1a; 所有代码如下&#xff1a; from si_fab import all as pdk import ipkiss3.all as i3 from ipkiss.geometry.shape_modifier import __ShapeModifierAutoOpenClosed__ from numpy import sqrtclass ShapeManhattanStub(__…

《ESP8266通信指南》11-Lua开发环境配置

往期 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发&#xff09;&#xff08;非常简单&#xff09;-CSD…

短信公司_供应群发短信公司

短信公司——供应群发短信公司 短信公司作为一种为企业提供群发短信服务的服务商&#xff0c;正逐渐受到市场的青睐。供应群发短信公司作为其中的一种类型&#xff0c;为各行各业的企业提供高效、便捷的短信推广渠道。本文将介绍短信公司的作用以及供应群发短信公司的特点和优势…

Django之创建Model以及后台管理

一&#xff0c;创建项目App python manage.py startapp App 二&#xff0c;在App.models.py中创建类&#xff0c;以下是示例 class UserModel(models.Model):uid models.AutoField(primary_keyTrue, auto_createdTrue)name models.CharField(max_length10, uniqueTrue, db…

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习 1、 for i in range(6):Spaceship.step(Item[i].x - Spaceship.x)Dev.step(Item[i].y - Dev.y)Dev.step(Spaceship.y - Dev.y)2、 for i in range(5):Spaceship.step(Item[i].x - Spaceship.x)Flyer[i].step(Item[…

车载测试___面试题和答案归纳

车载面试题 一、实车还在设计开发阶段&#xff0c;大部分测试通过什么测试&#xff1f; 答案&#xff1a;通过台架和仿真来完成的 二、测试部分划分&#xff1f; 测试部门是分为自研&#xff0c;系统&#xff0c;验收&#xff0c;自研部门是开发阶段测试&#xff0c;系统部门…

重发被恶意举报的主食冻干测评,速看可能再被删!PR、希喂和SC真实对比PK!

要给猫咪提供高品质主食&#xff0c;主食冻干是不二之选。主食冻干不仅含肉量高、吸收消化率高&#xff0c;还有着丰富的、普通猫粮无法提供的各类营养素&#xff0c;满足猫咪微量元素的需求。可以说是营养与生骨肉喂养媲美&#xff0c;又能完美避开生骨肉细菌超标带来的一系列…