Python数据结构-----非递归实现快速排序

news2024/10/7 8:30:04

 

目录

前言:

非递归快排

1.概念原理

2.示例

 Python代码实现

非递归快速排序


前言:

        上一期我们学习了通过递归来实现快速排序的方法,那这一期我们就来一起学习怎么去通过非递归的方法来去实现快速排序的功能。(上一期连接Python数据结构-----递归实现快速排序_灰勒塔德的博客-CSDN博客)

非递归快排

1.概念原理

         对于非递归来实现快排相较于递归效率更加高一些,但是代码量也相对增加了一些,如果要想通过非递归的方式去实现快排的话,这里就要用到数据结构栈或者队列的功能,栈和队列可以作为范围值的储存容器,当我们要对某一个范围里面的数据进行排序的时候就可以去取出来,如果有新的排序目标范围产生的话就可以把这个范围添加到里面去。

 原理过程

1. 最简单的实现快速排序的方法是利用递归来实现,如果要利用非递归的方法实现

2. 非递归的实现快速排序,可以利用栈来实现。其实递归的本质就是栈的先进后出的性质。

    利用快速排序每次是递归向左右子序列中进行排序,利用栈我们可以把左右子序列的端点值保存到栈中,然后每次取栈顶区间进行排序,直到栈为空则整个序列为有序

2.示例

(1)已有一组数据,对其进行排序

 (2)创建好一个栈,此时第一次入栈的是上面这组数组的首位位置

 (3)进入循环,取出栈里面的数组范围的元素,然后进行第一次快速排序之后

 (4)按照以上的流程走,每次进行一次快速排序之后就把返回i和j交汇位置的左右边首位位置依次入栈,直到栈为空就结束排序,此时排序完成。

 Python代码实现

非递归快速排序

import random as r

class Stack(object):
    '''创建栈'''
    def __init__(self):
        self.stack=[]
    def isempty(self):
        return self.stack==[]
    def push(self,data):
        self.stack.append(data)
    def pop(self):
        if not self.isempty():
            return self.stack.pop()

def PartSort(li,left,right):
    '''实现一轮的快速排序'''
    temp=li[left]
    i=left
    j=right
    while i!=j:
        while li[j]>=temp and i<j:
            j-=1
        while li[i]<=temp and i<j:
            i+=1
        if i<j:
            li[i],li[j]=li[j],li[i]
    li[left],li[i]=li[i],li[left]
    return i #返回此时交汇的位置

def quick_sort(left,right,li):
    '''利用栈非递归实现排序,多次调用快速排序流程'''
    stack=Stack()
    if left<right:#栈的初始化,把开始的头和尾指针放入栈
       stack.push(left)
       stack.push(right)
    else:
        return
    while not stack.isempty():#如果为非空栈
        j=stack.pop()#尾指针出栈
        i=stack.pop()#头指针出栈
        mid=PartSort(li,i,j) #进行快速排序,返回交汇处
        #作判断是否满足条件,然后添加指针入栈
        if i+1<mid:
            stack.push(i)
            stack.push(mid-1)
        if mid<j-1:
            stack.push(mid+1)
            stack.push(j)

if __name__ == '__main__':
    li=[r.randint(0,20) for _ in range(10)]
    print(li)
    quick_sort(0,len(li)-1,li)
    print(li)
#输出结果:
# [12, 8, 15, 4, 11, 16, 3, 17, 0, 20]
# [0, 3, 4, 8, 11, 12, 15, 16, 17, 20]

 好了,以上就是本期的全部内容了,我们下一期再见!

分享一张壁纸:

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

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

相关文章

新来一00后,给我卷崩溃了..

2022年已经结束结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的金三银四的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的…

SLIC超像素分割算法

SLIC超像素分割算法 《SLIC Superpixels》 摘要 超像素在计算机视觉应用中越来越受欢迎。然而&#xff0c;很少有算法能够输出所需数量的规则、紧凑的超级像素&#xff0c;并且计算开销低。我们介绍了一种新的算法&#xff0c;将像素聚类在组合的五维颜色和图像平面空间中&a…

大四的告诫

&#x1f442; LOCK OUT - $atori Zoom/KALONO - 单曲 - 网易云音乐 &#x1f442; 喝了一口星光酒&#xff08;我只想爱爱爱爱你一万年&#xff09; - 木小雅 - 单曲 - 网易云音乐 其实不是很希望这篇文章火&#xff0c;不然就更卷了。。 从大一开始&#xff0c;每天10小时…

ccf b类及以上会议(准备)

SoCCACM Symposium on Cloud Computing http://dblp.uni-trier.de/db/conf/cloud/ SimLess: simulate serverless workflows and their twins and siblings in federated FaaS.Pisces: efficient federated learning via guided asynchronous training论文截止时间&#xff1a…

实现自定义dialog样式

1定义弹出的dialog样式 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:layout_width"match_parent"a…

3. 排序

3. 排序 3.1 总纲 3.2 Comparable与Comparator接口介绍 由于我们这里要讲排序&#xff0c;所以肯定会在元素之间进行比较。规则的。在实际应用中&#xff0c;我们往往有需要比较两个自定义对象大小的地方。而这些自定义对象的比较&#xff0c;就不像简单的整型数据那么简单&a…

Python轻量级Web框架Flask(7)——翻页功能/多表操作

1、使用paginate实现分页&#xff1a; 基础指令&#xff08;新建对象&#xff09; 基础指令&#xff08;使用对象属性&#xff09; 2、几种类型的表操作&#xff1a; 一对一&#xff1a;例如一个人只能有一张身份证。一对多&#xff1a;例如班级和学生&#xff08;一个班级…

苦中作乐 ---竞赛刷题 完结篇(25分)

&#xff08;一&#xff09;目录 L2-014 列车调度 L2-024 部落 L2-033 简单计算器 L2-042 老板的作息表 L2-041 插松枝 &#xff08;二&#xff09;题目 L2-014 列车调度 火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道…

Java分布式事务(十二)

文章目录 🔥Hmily实现TCC分布式事务_项目搭建🔥Hmily实现TCC分布式事务实战_公共模块🔥Hmily实现TCC分布式事务_集成Dubbo框架🔥Hmily实现TCC分布式事务_项目搭建 创建父工程tx-tcc 设置逻辑工程 <packaging>pom</packaging>创建公共模块 创建转出银行…

分析 | 通过 NFTScan 率先捕获 NFT 投资趋势

NFT 市场信息高度动态且机会稍纵即逝&#xff0c;了解市场第一信息对于 NFT 的参与者来说都是至关重要的。所以市场主体参与者必须密切关注各种渠道&#xff0c;努力获取最新一手 NFT 信息&#xff0c;这对参与者抓住先机和获益至关关键&#xff0c;若信息滞后&#xff0c;容易…

【流畅的Python学习笔记】2023.4.21

此栏目记录我学习《流畅的Python》一书的学习笔记&#xff0c;这是一个自用笔记&#xff0c;所以写的比较随意 特殊方法&#xff08;魔术方法&#xff09; 不管在哪种框架下写程序&#xff0c;都会花费大量时间去实现那些会被框架本身调用的方法&#xff0c;Python 也不例外。…

【Python】matplotlib设置图片边缘距离和plt.lengend图例放在图像的外侧

一、问题提出 我有这样一串代码&#xff1a; import matplotlib.pyplot as plt plt.figure(figsize (10, 6)) " 此处省略代码 " legend.append("J") plt.legend(legend) plt.xlabel(recall) plt.ylabel(precision) plt.grid() plt.show()我们得到的图像…

KMP算法原理原来这么简单

我觉得这句话说的很好&#xff1a; kmp算法关键在于&#xff1a;在当前对文本串和模式串检索的过程中&#xff0c;若出现了不匹配&#xff0c;如何充分利用已经匹配的部分&#xff0c;来继续接下来的检索。 暴力解决字符串匹配 暴力解法就是两层for循环,每次都一对一的匹配&…

面试官:“请描述一下Android系统的启动流程”

作者&#xff1a;OpenGL 前言 什么是Android启动流程呢&#xff1f;其实指的就是我们Android系统从按下电源到显示界面的整个过程。 当我们把手机充好电&#xff0c;按下电源&#xff0c;手机会弹出相应启动界面&#xff0c;在等了一段时间之后&#xff0c;会弹出我们熟悉的主…

AI数据标注工程师这个职业怎么样?

本篇文章主要讲解ai数据标注工程师这个职业的具体情况和相关的职业前景 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月18日 数据是ai的灵魂&#xff0c;自然界中相对应的数据都活多少存在不准确、杂乱、无效等属性&#xff0c;需要人为进行收集、整理、分类和处理。其中ai…

Linux 内核原理摘录

文章目录 一、Linux 内核设计与实现1、进程管理&#xff08;1&#xff09;调度2、内核数据结构&#xff08;1&#xff09;kfifo 3、中断 一、Linux 内核设计与实现 本章主要用来摘录《Linux 内核设计与实现》一书中学习知识点&#xff0c;其基于 Linux 2.6.34 。 1、进程管理 …

PowerShell install go+caddy+filebrowser+nssm 实现部署文件系统

filebrowser filebrowser 是一个使用go语言编写的软件&#xff0c;功能是可以通过浏览器对服务器上的文件进行管理。可以是修改文件&#xff0c;或者是添加删除文件&#xff0c;甚至可以分享文件&#xff0c;是一个很棒的文件管理器&#xff0c;你甚至可以当成一个网盘来使用。…

找高清视频素材,就上这6个网站。

推荐6个高清视频素材库&#xff0c;免费下载&#xff0c;建议收藏~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有上千个&#xff0c;全部都很高清&#xff0c;站内可以按标签分类查找…

某医院访问医保系统慢流量分析案例

背景 我们已将NetInside流量分析系统部署到某市人民医院的机房内&#xff0c;使用流量分析系统提供实时和历史原始流量。本次分析重点针对访问外网医保系统性能进行分析&#xff0c;以供安全取证、性能分析、网络质量监测以及深层网络分析。 分析时间 报告分析时间范围为&am…

【Linux】进程间通讯

前提知识 进程间具有独立性 &#xff0c;现在我们要打破独立性&#xff0c;去通讯&#xff0c;所以 通讯的成本一定很高。 又时候又需要多进程协同完成某种业务内容 &#xff0c;例如以前&#xff1a; cat file | grep “hello",这就是两个进程之间的通讯。 通讯的本质就是…