学习笔记-数据结构-线性表(2024-04-18)- 单向链表选择排序

试以单向链表为存储结构实现简单选择排序的算法。

实现递增排序,首先选择一个元素作为第一个比较值,遍历其他所有的元素,如果发现其他元素中有比它小的元素,则交换两个元素,这样每一趟都能找到符合要求的最小值

正经的单向链表排序,不是换数据的那种!
思想是选择排序的思想,但问题在于单链表结构不同于数组的直接交换,需要断链和重新成链等各种操作,稍不留神就直接G了

具体实现步骤如下

  • 初始化指针变量a和b,它们都指向链表的头节点。
  • 外层循环遍历链表,直到节点b是链表中的最后一个节点。
  • 内层循环遍历以节点b为起始的子链表,寻找其中最小的节点d。
  • 如果节点b的值大于节点d的值,说明需要将节点d插入到节点b之前。
  • 根据不同情况进行节点的移动和连接操作:
    • 如果节点d紧跟在节点b后面,分为两种情况:
      • 如果节点b是链表的头节点,则直接将节点d移动到节点b之前,并调整头节点的指针。
      • 如果节点b不是链表的头节点,则将节点d移动到节点b之前,并更新a的next指针。
    • 如果节点b和节点d之间有其他节点,也分为两种情况:
      • 如果节点b是链表的头节点,则将节点d移动到节点b之前,并更新头节点的指针。
      • 如果节点b不是链表的头节点,则将节点d移动到节点b之前,并更新a的next指针。
  • 完成内层循环后,更新a和b的指针,继续下一轮循环,直到整个链表都被排序完成。
  • 最后返回排序后的链表头节点。

下面是C语言写法:

typedef struct Node
{int data;struct Node *next;
}LinkList;Node* selectionSort(LinkList* head) 
{ Node *a, *b, *c, *d, *r; // 声明指针变量 a, b, c, d, ra = b = head; // 初始化指针变量 a, b,它们指向链表头部// 当 b 不是最后一个节点时执行循环while (b->next) { c = d = b->next; // 初始化指针变量 c, d,它们指向 b 的下一个节点// 当 d 指向一个有效节点时执行循环while (d) { if (b->data > d->data) { // 如果 b 的值大于 d 的值if (b->next == d) { // 如果 d 紧跟在 b 后面if (b == head) { // 如果 b 是链表的头节点// 将 d 移动到 b 的前面b->next = d->next; d->next = b; // 交换 b 和 d 的指针r = b; b = d; d = r; c = d; // 更新 c// 更新链表头部head = b; // 跳到下一个元素,因为它已经是有序的d = d->next; } else { // 如果 b 不是链表的头节点// 将 d 移动到 b 的前面b->next = d->next; d->next = b; a->next = d; // 交换 b 和 d 的指针r = b; b = d; d = r; c = d; // 更新 c// 跳到下一个元素,因为它已经是有序的d = d->next; } } else { // 如果 b 和 d 之间有一些非零节点if (b == head) { // 如果 b 是链表的头节点// 交换 b->next 和 d->nextr = b->next; b->next = d->next; d->next = r; c->next = b; // 交换 b 和 d 的指针r = b; b = d; d = r; c = d; // 更新 c// 跳到下一个元素,因为它已经是有序的d = d->next; // 更新链表头部head = b; } else { // 如果 b 不是链表的头节点// 交换 b->next 和 d->nextr = b->next; b->next = d->next; d->next = r; c->next = b; a->next = d; // 交换 b 和 d 的指针r = b; b = d; d = r; c = d; // 更新 c// 跳到下一个元素,因为它已经是有序的d = d->next; } } } else { // 如果 b 的值不大于 d 的值// 更新 c 并跳到下一个元素,因为它已经是有序的c = d; d = d->next; } } a = b; // 更新 ab = b->next; // 更新 b} return head; // 返回排序后的链表头部
} 

下面是Java语言写法:


public class Main {public static class Node {int data; Node next; };public static Node selectionSort(Node head){Node a, b, c, d, r;a = b = head;while (b.next != null) {c = d = b.next;while (d != null) {if (b.data > d.data) {if (b.next == d) {if (b == head) {b.next = d.next;d.next = b;r = b;b = d;d = r;c = d;head = b;d = d.next;}else {b.next = d.next;d.next = b;a.next = d;r = b;b = d;d = r;c = d;d = d.next;}}else {if (b == head) {r = b.next;b.next = d.next;d.next = r;c.next = b;r = b;b = d;d = r;c = d;d = d.next;head = b;}else {r = b.next;b.next = d.next;d.next = r;c.next = b;a.next = d;r = b;b = d;d = r;c = d;d = d.next;}}}else {c = d;d = d.next;}}a = b;b = b.next;}return head;}// 新建Node节点static Node newNode(int val){ Node temp = new Node(); temp.data = val; temp.next = null; return temp; } 
} 

示例

以 -2-0-0-3-5-1- 单链表为例
由于动态演示图较大,csdn无法上传,请移步至 https://gitee.com/xjk2000/image-storage/blob/master/1.gif
Java代码测试执行:
测试代码
执行结果:
在这里插入图片描述

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

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

相关文章

展开说说:Android Fragment完全解析-卷一

1、是什么 Fragment 中文意思是碎片,Android 3.0推出的一个系统组件,主打一个在应用界面中可模块化又可重复使用。 Fragment 它很独立,它可以定义和管理自己的布局,具有自己的生命周期,并且可以处理自己的输入事件。…

4.18学习总结

多线程补充 等待唤醒机制 现在有两条线程在运行,其中一条线程可以创造一个特殊的数据供另一条线程使用,但这个数据的创建也有要求:在同一时间只允许有一个这样的特殊数据,那么我们要怎样去完成呢?如果用普通的多线程…

解决Error in writing header file of the driver

在源代码里面更新了一批常规的内容,编译的时候遇到一个error,一大片都是红的。XXX是项目名称。 Description Resource Path Location Type Generator: ERROR: Error in writing header file of the driver XXX Cpu Processor Expert Problem 表面意思是…

【学习】Jmeter、postman、python如何与数据库相互配合

在当今数字化时代,数据库已经成为我们日常生活中不可或缺的一部分。无论是购物、社交还是工作,数据库都在默默地为我们提供着高效、稳定的服务。而在众多的技术工具中,Jmeter、Postman和Python成为了操作数据库的三大主流技术。今天&#xff…

【嵌入式DIY实例】-指纹锁

DIY指纹锁 文章目录 DIY指纹锁1、硬件准备1.1 R307指纹传感器模介绍2、硬件接线原理图3、代码实现在这个项目中,我们将使用 Arduino 构建一个指纹门锁安全系统。 该系统可用于我们的家庭、办公室等提供安全保障。 我们还可以用它来打开门,只需将手指放在门锁上即可。 安全是许…

Linux管道共享内存

前言 进程虽然是独立运行的个体,但它们之间有时候需要协作才能完成一项工作,比如有两个进程需要同步数据,进程 A 把数据准备好后,想把数据发往进程 B,进程 B 必须被提前通知有数据即将到来,或者进程 A 想发…

项目七:学会使用python爬虫解析库(小白大成级)

前期我们学会了怎么使用python爬虫请求库和解析库的简单应用和了解,同时能够对爬虫有一个较为清晰的体系,毕竟简单的爬虫基本上都是请求数据——解析数据——存储数据的大概流程。 那么回忆一下,请求库我们学的是requests模块,解…

项目管理-项目开发计划介绍

目录 一、内容总览 二、项目开发计划概述 2.1 概述 2.2 项自开发计划的目的和作用 2.3 项目开发计划的内容 2.3.1 工作计划 2.3.2 人员组织计划 2.3.3 设备采购和资源供应计划 2.3.4 配置管理计划 2.3.5 进度安排计划 2.3.6 成本投资计划 2.3.7 质量保证计划 2.3.8…

实现I.MX6ULL开发板与Windows和Ubuntu系统之间的通信

虚拟机与主机之间的连接方式确实包括桥接模式、NAT模式和仅主机模式。 桥接模式(Bridged):在桥接模式下,虚拟机通过虚拟交换机直接连接到主机的物理网络上,就像一台独立的物理机器一样,拥有自己的IP地址&a…

[阅读笔记23][JAM]JOINTLY TRAINING LARGE AUTOREGRESSIVE MULTIMODAL MODELS

这篇论文是24年1月发表的,然后是基于的RA-CM3和CM3Leon这两篇论文。它所提出的JAM结构系统地融合了现有的文本模型和图像生成模型。 主要有两点贡献,第一点是提出了融合两个模型的方法,第二点是为混合模型精心设计的指令微调策略。 下图是一个…

Unity射击游戏开发教程:(1)玩家控制

玩家的移动 玩家控制和移动是视频游戏中最酷的事情之一,因为你正在控制游戏中的某些东西 现在游戏中的玩家是我们的蓝色方块英雄。我在游戏开发中了解到,游戏是用简单的对象制作原型,然后添加所有漂亮的艺术和声音。代码… 我们要做的第一件事是在游戏开始时为玩家提供一个…

MATLAB 体素滤波(62)

MATLAB 体素滤波(62) 一、算法介绍二、算法实现1.代码(已验证,直接运行)一、算法介绍 这里的代码完成文件读入,体素滤波,效果显示,结果输出的操作,下面是效果截图,后面是代码。 体素滤波(Voxel Filtering)是一种用于三维点云数据处理的方法,其原理类似于二维图像…

力扣HOT100 - 142. 环形链表 II

解题思路&#xff1a; public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return head;}head head.next;}return null;} }

广西建筑模版厂家批发供应,当天发货全国可达

近年来&#xff0c;建筑行业蓬勃发展&#xff0c;对高质量的建筑模板需求量逐渐增加。在这个竞争激烈的市场中&#xff0c;贵港市能强优品木业有限公司以其出色的产品和卓越的服务迅速崭露头角&#xff0c;成为知名的建筑模板生产厂家。 作为一家拥有25年生产经验的公司&#x…

用FRP配置toml文件搭建内网穿透

需求场景 1、一台外网可访问的有固定ip的云服务器&#xff0c;Ubuntu系统 2、一台外网无法访问的无固定ip的本地家用电脑&#xff0c;Ubuntu系统 需求&#xff1a;将云服务器搭建为一台内网穿透服务器&#xff0c;实现通过外网访问家用电脑&#xff08;网页&#xff09;的功能。…

人工智能|机器学习——基于机器学习的信用卡办卡意愿模型预测项目

一、背景介绍 在金融领域&#xff0c;了解客户的信用卡办卡意愿对于银行和金融机构至关重要。借助机器学习技术&#xff0c;我们可以根据客户的历史数据和行为模式预测其是否有办理信用卡的倾向。本项目通过Python中的机器学习库&#xff0c;构建了两个常用的分类模型&#xff…

Ardupilot无人船(车)自动调参

无人船&#xff08;车&#xff09;快速调参脚本简化了为无人船&#xff08;车&#xff09;角速率和速度控制器调参的过程。 该脚本应该在无人船&#xff08;车&#xff09;在Circle模式下循环绕圈时运行。它记录转向和油门输出以及由此产生的响应(例如无人船&#xff08;车&am…

高精度算法(2)

前言 延续上次所讲的内容再对乘法和除法进行说明&#xff0c;希望有所帮助 注意这里的乘除法都是针对于整数如果要是涉及到小数&#xff0c;我们得使用二分法 通过二分同样可以解决小数精度问题 高精度乘法 思路 我们只能用字符串来读取一个很大很大的数&#xff0c;所以…

阿赵UE学习笔记——28、粒子系统Niagara简介

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次开始学习粒子系统的使用。 一、Cascade系统 在介绍UE5的Niagara系统之前&#xff0c;必须先介绍一下旧版本的粒子系统。   在UE4的时候&#xff0c;虚幻引擎的粒子系统叫做Cascade&#x…

【论文阅读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…