python实现的基于单向循环链表插入排序

       相比于定义一个循环双向链表来实现插入排序来说,下面的实现采用一个单向循环链表来实现,并且不需要定义一个单向循环链表类,而是把一个list(数组/顺序表)当成单向循环链表来用,list的元素是一个包含两个元素的对象,一个是数值,一个是指向下一个list元素的指针(list的元素下标),list的第一个元素(下标为0的元素)是单链表的头结点,它不存放数据,起到哨兵的作用。

        排序的时候,把一个数据元素插入一个位置,不需要移动数据,只需要修改该位置前一个list元素和待插入数据元素的指针域就行,其实就是个单向链表的插入操作。

        通过一遍循环操作完成排序之后,顺序表就被链表化了。

        下面给出一个顺序表被链表化的过程的图示:

       可以很方便的按照访问链表的方式来完成对数据的有序(正序/逆序)遍历访问,但如果是执行查找,不能进行二分查找,只能顺序查找,效率不高,所以还需要把顺序表变成有序表。

        有两种方式来实现这一点。

        第一种,可以new一个空的list,遍历链表,依次把访问到的元素append到list中,最后返回这个list。

       第二种,就地对顺序表重排,实现的逻辑并不复杂,思路是依次取链表的数据元素把它们依次从前往后排在顺序表中,如果它们本身就在应该排的位置什么都不用做,取下一个数据元素继续,如果它们不在应该排的位置上,那么把它们和当前占着该位置的数据元素交换,并且把它们的指针域改成交换出去的数据元素交换到的位置,当后续对被交换出去的数据元素排位的时候,根据它前一结点指针域访问的是它在顺序表中旧(最初)的位置,需要从现在占用它旧位置的数据元素的指针域去取它的当前位置,但有可能在前面的排位过程中它的位置被调换了多次,因此这可能是一个连锁式的查找过程,这个算法的复杂性全在这一点上了。

       下面给出一个顺序表重排变成一个有序表的过程的图示:

      下面给出代码实现:

def sortwrap(inplace=True):def inner(f):if inplace:def sort(source):source = f(source)next = source[0][1]for i in range(1, len(source)):if i != next:source[i], source[next] = source[next], source[i]next, source[i][1] = source[i][1], nextelse:next = source[i][1]while next <= i and next != 0:next = source[next][1]return sourceelse:def sort(source):source = f(source)pos = source[0][1]result = []while pos != 0:result.append(source[pos][0])pos = source[pos][1]return resultreturn sortreturn inner@sortwrap()
def _insertsort(source):if not source:return source_source = [[0, 0]]_source += [[i, 0] for i in source]head = _source[0]head[1] = 1_source[1][1] = 0for i in range(2, len(_source)):prev = headwhile _source[prev[1]] is not head:if _source[i][0] < _source[prev[1]][0]:_source[i][1] = prev[1]prev[1] = ibreakelse:prev = _source[prev[1]]else:_source[i][1] = prev[1]prev[1] = ireturn _sourceprint(_insertsort((49, 38, 65, 97, 76, 13, 27, 52)))

       这个算法的亮点是实现了顺序表和链表的互转,挺有启发意义的。  

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

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

相关文章

css 将div固定在页面顶部不随页面滑动

为了将一个 div 设置为固定在页面顶部&#xff0c;并且高度为 5rem&#xff0c;宽度为 100vw&#xff0c;不随页面滚动&#xff0c;可以使用几种不同的 CSS 技术来实现。下面我将列举几种常见的方法&#xff1a; 1. 使用 position: fixed 最直接的方法是使用 position: fixed…

Docker的介绍及与传统虚拟化技术的区别

Docker是一个开源的应用容器引擎&#xff0c;它使得开发者可以将应用及其依赖包打包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上。Docker基于Go语言开发&#xff0c;它的出现极大地简化了应用程序的部署、管理和扩展。 以下是Docker…

【Windows,亲测有效】手动激活Sublime Text

前言 Sublime Text 是一款非常好用的文本编辑器&#xff0c;但是免费版时不时会跳弹窗 本方法无毒无害&#xff0c;简单易上手 2023/12/22 更新&#xff1a;实测从 4143 支持到 4169 开始 先确保你用的是官方版本的 Sublime Text&#xff0c;还没下的可以去官方下载&#…

Winform的App.config文件配置的读取

配置 App.config 文件&#xff1a; 在 Visual Studio 中&#xff0c;打开您的项目并找到 App.config 文件&#xff08;如果不存在&#xff0c;则可以通过右键单击项目&#xff0c;选择“添加” > “新建项” > “应用程序配置文件”来创建它&#xff09;。在 App.config…

typescript学习笔记3

类型推断&#xff08;Type Inference&#xff09; TypeScript 编译器会在编译过程中进行类型推断。这意味着在很多情况下&#xff0c;你不需要明确地为变量或表达式指定类型&#xff0c;TypeScript 会根据上下文自动推断出最合适的类型。 typescript let x 10; // TypeScript…

Shell脚本知识点汇总表格总结

现在后端开发程序员&#xff0c;基本上都需要具备基本的运维能力&#xff0c;所以shell脚本编程也是非常重要的。所以需要掌握shell脚本的知识&#xff0c;并具备编写shell脚本的能力&#xff0c;我想把最近这几年在广州图书馆看的关于shell脚本的知识做个总结汇总&#xff0c;…

net lambda 、 匿名函数 以及集合(实现IEnumerable的 如数组 、list等)

匿名函数&#xff1a;》》》 Action a1 delegate(int i) { Console.WriteLine(i); }; Lambda:>>> Aciont a1 (int i) > { Console.WriteLine(i); }; 可以简写 &#xff08;编译器会自动根据委托类型 推断&#xff09; Action a1 &#xff08;i&#xff09;> {…

笔记本无线网络共享给有线使用

1.鼠标右击wifi图标选择打开网络和Internet设置 2.选择WLAN项&#xff0c;点击进入更改适配器选项 3.进入到以下界面&#xff0c;右击以太网选择启动&#xff08;不确定的话可以在设备管理器查看网卡&#xff09; 4.右击WLAN选项&#xff0c;点击属性 5.点击共享&#xff0…

搭建vue3组件库(一): Monorepo架构搭建

文章目录 1. 以 pnpm 构建 monorepo1.1 全局安装 pnpm1.2 配置 pnpm 的 monorepo 工作区1.3 仓库项目内的包相互调用1.4 TypeScript 初始化配置文件 2. 通用配置文件2.1 添加 .editorconfig 编辑器格式配置文件2.2 添加 .gitignore git 忽略文件2.3 添加 .npmrc npm配置文件2.4…

esp32s3使用psram后音频播报不了的问题解决记录

idf.py menuconfig开启psram后会报错 提示需要打补丁&#xff1a; 根据提示切换到IDF_PATH目录&#xff0c;然后执行git apply %ADF_PATH%/ida_patches/idf5.0_freertos.patch打补丁。 再次编译提示如下错误&#xff1a; assert failed: spi_flash_disable_interrupts_cach…

【Qt QML】Pane组件

Pane&#xff08;窗格&#xff09;提供与应用程序样式和主题匹配的背景色。窗格不提供自己的布局&#xff0c;但需要您定位其内容&#xff0c;例如通过创建RowLayout或ColumnLayout。 声明为窗格的子项的项自动成为窗格的contentItem的父项。动态创建的项需要显式地添加到conte…

VSCode 配置 CMake

VSCode 配置 C/C 环境的详细过程可参考&#xff1a;VSCode 配置 C/C 环境 1 配置C/C编译环境 方案一 如果是在Windows&#xff0c;需要安装 MingW&#xff0c;可以去官网(https://sourceforge.net/projects/mingw-w64/)下载安装包。 注意安装路径不要出现中文。 打开 windows…

06 - 步骤 add constants

简介 Add Constants 步骤是用于在数据流中添加常量字段的步骤。它允许用户在数据流中插入一个或多个常量字段&#xff0c;并为这些字段指定固定的数值、字符串或其他类型的常量值。 使用 场景 我需要在数据清后&#xff0c;这个JSON 字符串有一个固定的行流数据。 1、拖拽…

数字旅游引领未来智慧之旅:科技应用深度重塑旅游生态,智慧服务全面升级打造极致高品质旅游体验

随着信息技术的飞速发展&#xff0c;数字旅游作为旅游业与科技融合的新兴业态&#xff0c;正以其独特的魅力和优势&#xff0c;引领着旅游业迈向智慧之旅的新时代。数字旅游不仅通过科技应用重塑了旅游生态&#xff0c;更通过智慧服务为游客带来了高品质的旅游体验。本文将深入…

grpc笔记

教程地址 【狂神说】gRPC最新超详细版教程通俗易懂 | Go语言全栈教程_哔哩哔哩_bilibili rpc 定义&#xff1a;Remote Procedure Call——远程过程调用&#xff0c;通俗的含义是&#xff1a;远程定义好方法名、参数和返回值&#xff0c;RPC可以像调用本地方法那样调用远端方…

中兴F7607P自启动程序,关闭JAVA插件

中兴F7607P自启动程序&#xff0c;关闭JAVA插件 本文目的&#xff1a;关闭光猫内自动运行的JAVA插件&#xff0c;并实现开机自动调用用户的程序启动 原文地址 移动定制版F7607P不带LXC容器&#xff0c;取而代之的是JAVA虚拟机&#xff0c;内置多个插件&#xff0c;包括名为C…

Python和Julia河流湖泊沿海水域特征数值算法模型

&#x1f3af;要点 一维水流场景计算和绘图&#xff1a; &#x1f3af;恒定透射率水头和流量计算&#xff1a;&#x1f58a;两条完全穿透畜水层理想河流之间 | &#x1f58a;无承压畜水层两侧及两条完全穿透畜水层的补给 | &#x1f58a;分水岭或渗透性非常低的岩体的不渗透边…

Flask简介

Flask简介 安装概述使用PyCharm创建一个Flask程序 Flask程序的基本结构初始化路由和视图函数启动服务器请求-响应循环 安装 概述 Flask算是小型框架&#xff0c;小到可以称为“微框架”。Flask 非常小&#xff0c;因此你一旦能够熟练使用它&#xff0c;很可能就能读懂它所有的…

《MySQL对库的基本操作》

文章目录 一、查看数据库列表查看数据库中的所有表想知道当前处于哪个数据库里 二、创建一个数据库三、删除一个数据库知道两个集1.字符集2.校验集修改数据库的字符集和编码集 不同的校验码对数据库的影响四、数据库的备份与恢复注意事项&#xff1a;备份数据库中的表 总结 一、…

现代神经网络总结(AlexNet VGG GoogleNet ResNet的区别与改进)

VGG NIN GoogleNet 1.VGG&#xff0c;NIN&#xff0c;GoogleNet的块结构图对比(注意:无AlexNet) 这些块带来的区别与细节 AlexNet未使用块,主要对各个层进行了解: 卷积:捕捉特征 relu:增强非线性 池化层:减少计算量 norm:规范数据分布 全连接层:分类VGG块的改善(对比AlexNe…