python数据结构与算法 35 快速排序

ANSYS 有限元分析 支架拓扑优化设计 分析过程及常见问题解决 1.确定分析类型,所用模块包括两种 static structural Topology Optimization。3.通过草图建立几何模型,建好的几何模型如图1所示。2.工程材料采用默认的Q235。 阅读详情

快速排序

快速排序也使用了分而治之的策略来提高性能,而且不需要额外的内存,但是这么做的代价就是,列表不是对半切分的,因而,性能上就有所下降。

快速排序选择一个数值,一般称为“轴点”,虽然有很多选取轴点的方法,我们还是简单地把列表中第一个元素做为轴点了。轴点的作用是帮助把列表分为两个部分。列表完成后,轴点所在的位置叫做“切分点”,从这一点上把列表分成两部分供后续调用。

图12所示,54将作为轴点。这个例子我们已经排过多次了,我们知道54在排好序后将处于现在31的位置上。找到轴点以后,把列表中其他元素,按比轴点大或比轴点小的方法,分成两部分。


图12  快速排序的第一个轴点

切分开始于定位两个位置标志……就叫做“左标”和“右标”好了……分别位于剩余列表元素的开始和结束处(图13的1位和8位)。切分的目标,是把相对于轴点来说,位置错误的元素移动在正确的位置上,同时左标和右标也将在“切分点”上相聚。


图13  找到54的切分点

我们把leftmark 不停地+1,直到遇到一个元素值大于轴点。然后把rightmark 不停-1直到遇到一个元素值小于轴点值。这时,我们发现这两个元素的位置不对,如上例中那样,遇到了93和20,现在把两个元素交换,然后重复上述过程。

当rightmark 小于 leftmark时,停止。这时rightmark 成为切分点,轴点值与切分点的值交换,轴点已经找到位置(图14)。另外,所有切分点左边的元素都小于轴点,所有右边的元素大于轴点,这时列表从切分点处分成两个子表,使用递归调用重复快速排序过程。


图14  完成切分

下面是实现quickSort的函数。它调用了一个递归函数quickSortHelper. quickSortHelper.的基点和归并排序是一样的,如果列表的长度小于等于1,它就是有序的,如果大于1,它就要被切分并且递归排序。Partition 函数完成前面提到过的切分过程。

def quickSort(alist):
   quickSortHelper(alist,0,len(alist)-1)

def quickSortHelper(alist,first,last):
   if first<last:

       splitpoint = partition(alist,first,last)

       quickSortHelper(alist,first,splitpoint-1)
       quickSortHelper(alist,splitpoint+1,last)


def partition(alist,first,last):
   pivotvalue = alist[first]

   leftmark = first+1
   rightmark = last

   done = False
   while not done:

       while leftmark <= rightmark and \
               alist[leftmark] <= pivotvalue:
           leftmark = leftmark + 1

       while alist[rightmark] >= pivotvalue and \
               rightmark >= leftmark:
           rightmark = rightmark -1

       if rightmark < leftmark:
           done = True
       else:
           temp = alist[leftmark]
           alist[leftmark] = alist[rightmark]
           alist[rightmark] = temp

   temp = alist[first]
   alist[first] = alist[rightmark]
   alist[rightmark] = temp


   return rightmark

alist = [54,26,93,17,77,31,44,55,20]
quickSort(alist)
print(alist)

为了分析快速排序函数性能,要注意到一个长度为n的列表,如果切分点总是在列表的中间,那么就是要logn 次切分。为了找到切分点,n个元素都要与轴点作一次比较,结果需要nlogn.另外,也不需要象归并排序一样消耗额外的内存。不幸的是,在最怀的情况下,切分点不在中间,而是偏左或偏右,生成很不均匀的子表,这种情况下,生成的子表是一个0个元素,一个n-1个元素,然后再切分,却生成一个子表是0个元素,另一个是n-2个元素等等。结果需要的开销就是O(n2)。

前面我们提到过有不同的方式来选择轴点,尤其是,我们可以使用一种叫做“三数取中”的技术,以减轻不均匀切分的可能性。这种方法从列表的第一个,中间的一个,最后的一个元素三个数中,取中间值。象上面的例子中,三数是54,77和20,,那么选中54作为轴点。这种思想的来源,是认为第一个元素可能它的大小并不在中间的位置,但是三个数的中间值就比较靠近中间。这种方法特别适合那些开始时已经部分有序的列表。这个轴点值的选择方法留作练习。


UNet 改进(27):结合SCSE注意力机制的UNet网络实现 本文介绍了一种结合SCSE注意力机制的改进UNet网络架构。该网络在保持UNet经典编码器-解码器结构基础上,通过在每层添加SCSEBlock模块,融合了通道注意力和空间注意力机制。通道注意力通过全局池化和1×1卷积生成通道权重,空间注意力则产生空间权重图,二者相加增强关键特征响应。该设计具有以下优势:1)保持原始UNet的多尺度特征提取能力;2)通过注意力机制提升对重要区域的关注度;3)计算效率高,仅增加少量参数。测试显示网络能保持输入输出分辨率不变,适用于医学图像分割等像素级预测任务。完整代码实现了5层 阅读详情

相关推荐

Qt Tab Widget 实战:如何打造一个可动态增删的标签页管理器(附完整代码)

本文深入探讨了使用Qt框架中的Tab Widget控件构建动态标签页管理器的实战方法。通过分析动态增删的核心挑战,提供了完整的C++代码示例,涵盖信号槽机制、页面生命周期管理、上下文菜单实现以及状态持久化等关键功能,帮助开发者打造高效、用户友好的桌面应用界面。

bb456的博客 1042

十大经典排序算法-快速排序算法详解

一、什么是快速排序 1.概念 快速排序(Quick Sort)是从冒泡排序算法演变而来的,实际上是在冒泡排序基础上的递归分治法。快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分 2.算法原理 这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照快速排序的思想,我们先选择一个基准元素,进行排序 我们选取4为我们的基准元素,并设置基准元素的位置为index,设置两个指针left和right,分别指向最左

qq_35344198的博客 8万+

告别拼音!用VSCode+Dosbox-X搞定汇编语言课程设计里的中文姓名显示

本文详细介绍了如何利用VSCode和Dosbox-X解决汇编语言课程设计中中文姓名显示的问题。通过配置开发环境、理解GB2312编码及正确使用汇编指令,学生可以告别拼音显示,实现中文字符的正确输出。文章还提供了完整的代码示例和常见问题排查方法,帮助读者快速掌握这一实用技能。

weixin_30872337的博客 424

【python】面试常考数据结构算法

这里整理的都是基础的不能再基础的算法,目的就是进行一个回忆,同时作为剑指offer的一个补充~嘿嘿~ 查找算法二分查找# 实现一个二分查找# 输入:一个顺序list# 输出: 待查找的元素的位置def binarySearch(alist, item): first = 0 last = len(alist) - 1 while first <= last: ...

weixin_30747253的博客 187

Python之美——Python2与Python3多版本共存

Python多版本共存的方法Python2、Python3共存的方法python2下载及环境变量配置第一步、打开Python官网,下载Python2第二步、python2环境变量配置测试结果 Python2、Python3共存的方法 方法如下: 1.先确保不同版本解释器的python.exe所在的路径在环境变量中 2.拷贝各自的python.exe并重命名即可 步骤(理解不了下面有图示): 1、首先你需要将不同的python版本安装,且都已经将跟版本的环境变量配置好了,python3和2的下载方式

chenchen5152的博客 3944

GT911触摸驱动避坑指南:从寄存器读取到多点触控处理的5个关键步骤详解

本文深入解析了GT911触摸驱动开发中的关键步骤与常见问题。从硬件初始化、I2C通信建立,到核心寄存器操作、缓冲区状态管理,再到配置表烧录与多点触控数据解析,提供了详尽的避坑指南。文章结合STM32等平台的实战代码,重点阐述了驱动调试中的时序、中断处理和坐标映射等核心要点,帮助开发者高效实现稳定可靠的多点触控功能。

weixin_29189363的博客 675

快速排序

# include void swap(int a[],int l, int r) { int temp; temp = a[l]; a[l] = a[r]; a[r] = temp; } void Quicksort(int a[],int begin, int end) { if (begin >= end) r

silence35的博客 284

今天出一个candence 17.4 allego的安装教程

7、安装完成,接下来进行补丁更新,找到Hotfix_SPB17.40.035_wint.iso软件 ,右击鼠标选择装载。6、因为之前选择的定制安装,这一步不知道具体要安装啥,因此都勾选,点击NECK,接下来等待安装完成。后面经过仔细对比,发现是前面更新补丁时选择了F盘,F盘是candence安装包,不是补丁。8、在破戒大师里选择安装更新补丁,并找到刚才装载的安装包里的程序,点击下一步。3、打开破戒大师,找到安装candence进行如下图选择,点击下一步。有耐心的人可以重新卸了再装一边,我就不卸了,直接装。

hcvinh的博客 2725

视频教程-Python数据结构与算法视频教程-Python

Python数据结构与算法视频教程 知乎 Python 后端工程师。 htt...

weixin_30844801的博客 706

windows版vCenter STS证书替换步骤说明

windows版vCenter STS证书,手动更新步骤

技术是手段,服务才是目的。开源与协作是创新的活水,而核心技术的自主可控是立足之本。身处黄金时代,唯持续学习,方能不惧变化。从使用者到创造者,中国技术的未来,正待你们接过火炬,走得更远、更稳、更好。 1042

100天精通Python(可视化篇)——第98天:Pyecharts绘制多种炫酷日历图参数说明+代码实战

一、日历图介绍 二、基础配置 1. 配置项类 2. 添加函数 3. 日期标签配置 4. 坐标系配置 三、日历图实战 1. 基础日历图 2. 日历热图

努力让自己发光,对的人才能迎着光而来 2万+

快速排序及其Python实现【图解算法】

快速排序及其Python实现【图解算法】1. 引出问题2. 选择排序3. 快速排序 1. 引出问题 假设你的手机中存储了很多乐曲,对于每个乐队,你都记录了其作品被播放的次数。 乐队 播放次数 RADIOHEAD 156 KISHOKE KUMAR 141 THE BLACK KEYS 35 NEUTRAL MILK HOTEL 94 BECK 88 THE STROKES 61 WILCO 11 你想将乐队按照播放次数从多到少进行排列,从而将你喜欢的乐队排序,怎么

qq_18820125的博客 696

vLLM 显存泄漏与 OOM 深度排查:从日志到火焰图

系统性地排查 vLLM 运行中的显存泄漏和 OOM 问题,包括 CUDA 内存快照、PyTorch 内存分析器、火焰图工具。

kaixin110a的博客 186

【python】数据结构与算法之快速排序(重要)

一、快速排序 设定一个基准值pivot 将数组重新排列,所有比pivot小的放在其前面,比pivot大的放后面,这操作称为分区操作 对两边的数组重复前面两个步骤 二、画图演示 三、代码块 采用递归思想 def quickSort(nums): n=len(nums) if n<=1: return nums pivot=nums[0] left=[] right=[] for i in range(1,n): if nu

python全栈 500

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数据结构与算法(python):归并排序和快速排序算法及分析

参考自 MOOC数据结构与算法Python版 目录一、归并排序 Merge Sort1.1 算法思路1.2 代码及算法分析 一、归并排序 Merge Sort 1.1 算法思路 归并排序是递归算法, 思路是将数据表持续分裂为两半, 对两半分别进行归并排序 【步骤】 递归的基本结束条件是:数据表仅有1个数据项,自然是排好序的; 缩小规模:将数据表分裂为相等的两半,规模减为原来的二分之一; 调用自身:将两半分别调用自身排序,然后将分 别排好序的两半进行归并,得到排好序的数据表 1.2 代码及算法分析 【代

番茄大人的博客 568

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最新Python数据结构与算法教程

适用人群 Python初、中级学习者和开发者,对Python数据结构和算法感兴趣的学生和开发者。 课程概述 Python目前在人工智能,运维,后端开发,爬虫等领域使用越来越广泛,而数据结构和算法是计算机科学的基础知识。本课程使用Python语言系统讲解了常用数据结构和算法,帮助学习者提升开发技能。 课程特点: 1.每个算法和数据结构都有讲义、视频(包含讲解、图示、手动模拟)、源...

qq_46241791的博客 502

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python快速排序原理和实现案例

def quick_sort(mlist,start,end): """ :param mlist: :param start: :param end: :return: 快速排序,又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外 一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归.

caoxinjian423的博客 339

python冒泡算法和排序算法_Python之排序算法:快速排序与冒泡排序

Python之排序算法:快速排序与冒泡排序入坑(简称IT)这一行也有些年头了,但自老师讲课提过排序算法后几乎再也没写过排序算法,当然这也没有什么问题,实际的排序大多是将数据从数据库取出来前在数据库中就已经做好排序了,当然这个排序是SQL范畴的,如果真的需要在代码中排序也有对应的工具类来处理,就比如有Java中有Array.sort()来排列Array(数组类型),功能虽说有限制,但也免去了撸码的时...

weixin_39570530的博客 125

python数据结构谁讲得好_非常难得Python好课-基于Python的数据结构与算法视频教程 Python数据结构精讲教程...

非常难得Python好课-基于Python的数据结构与算法视频教程 Python数据结构精讲教程1.JPG (42.29 KB, 下载次数: 0)2019-11-5 00:01 上传3.JPG (38.01 KB, 下载次数: 0)2019-11-5 00:01 上传2.JPG (44.02 KB, 下载次数: 0)2019-11-5 00:01 上传数据结构与算法相信大家都不陌生,但在以往有很多...

weixin_39851008的博客 138

python数据结构和算法视频教程_基于Python的数据结构与算法视频教程,Python数据结构精讲教程下载...

课程名称非常难得Python好课-基于Python的数据结构与算法视频教程 Python数据结构精讲教程数据结构与算法相信大家都不陌生,但在以往有很多基于JAVA或C等语言的数据结构与算法课程却鲜有基于Python来讲解的数据结构与算法课程,这跟过去几年Python的火热却形成了鲜明的反差不过原因不是我们讨论的重点,技术和学习才是我们的最重要的任务,那么这套非常难得的Python数据结构与算法课程...

weixin_39683163的博客 273

python数据结构与算法中文教程_《Python数据结构与算法教程》完整版_资源网站...

《网易云课堂《目录章节1: Python数据结构与算法章节2:抽象数据类型和面向对象编程课时3抽象数据类型和面向对象编程07:40章节3:数组和列表课时4python 数组和列表10:54章节4:链表课时5单链表110:38课时6单链表209:09课时7循环双端链表111:12课时8循环双端链表209:17章节5:队列课时9队列10:21课时10用数组实现队列09:09课时11双端队列03:19章...

weixin_39974409的博客 243

python--数据结构--冒泡排序、快速排序

代码实现: # change_type_sort.py from collections import deque from typing import List class Record: def __init__(self, key): self.key = key self.other_info = None class Records: def __init__(self, record_list: List[Record]): ...

Chasing__Dreams的博客 315

python3——快速排序

快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 步骤为: 从数列中挑出一个元素,称为"基准"(pivot...

198

python数据结构和算法视频教程_趣资料-Python教程:数据结构与算法的Python视频教程...

课时9队列10:21课时10用数组实现队列09:09课时11双端队列03:19章节6:栈课时12栈12:48章节7:算法分析课时13算法时间复杂度和空间复杂度10:40章节8:哈希表课时14哈希表112:14课时15哈希表209:56课时16哈希表311:20章节9:字典课时17python dict 实现07:25章节10:集合课时18python set 原理和实现10:46章节11:递归课时...

weixin_39683163的博客 101

python数据结构与算法第88讲_网易云课堂-Python数据结构与算法,视频教程下载,价值88元

网易云课堂-Python数据结构与算法,视频教程下载,价值88元

weixin_39659837的博客 289

排序算法—快速排序算法分析与实现(Python)

快速排序采用的思想是分治思想。 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的

HeiSeDiWei的博客 667
上一篇: python数据结构与算法 34 归并排序
下一篇: python数据结构与算法 36 树的基本概念
杀了这个男孩
博客等级 码龄18年 149粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值