【数据结构】对单链表进行简单选择排序,使结点元素递增

BJFU_数据结构习题_294基于链表的简单选择排序 294基于链表的简单选择排序 描述 试以单链表为存储结构,实现简单选择排序算法。 输入 多组数据,每组数据两行。第一行为序列的长度n,第二行为序列的n个元素(元素之间用空格分隔,元素都为正整数)。当n等于0时,输入结束。 输出 每组数据输出一行,为从小到大排序后的序列。每两个元素之间用空格隔开。 输入样例 1 5 4 5 3 2 9 6 1 3 5 7 9 2 0 输出样例 1 2 3 4 5 9... 阅读详情

1.算法思想

  1. 循环创建单链表
  2. 使用简单选择排序找到当前最小的结点的值
  3. 交换最小值与当前值
  4. 重复2,3两步,直到排序完成

2.定义结构体

只使用到单链表的数据结构:

  • data: 存放数据元素
  • next: 用于指向下一个结点的指针
typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;

3.函数实现

工作指针:

  • min: 指向每一轮比较完成后的最小结点
  • p: 指向当前结点,每次比较完成后都将与min比较是否交换数据元素
  • q: 用于遍历链表,每次都从p的下一个结点开始,查找当前轮的最小结点

简单选择排序的基本思想:

  1. 将最小值min设置为当前结点p,从p的下一个结点q开始查找,如果遇到比最小值结点min还小的值,则修改min,让其指向q
  2. 交换p和min指向的数据。使用中间变量tmp暂存p的值。完成后p指针后移
  3. 重复1,2两步,直至排序完成
void ChooseSort(LinkList &A) {
    //工作指针,min指向最小结点,p指向当前结点,q为工作指针,用于每轮的遍历
    LNode *min,*p,*q;
    int tmp;//暂存当前结点值,用于交换数据
    if(!A->next) {
        printf("链表为空!\n");
        return;
    }
    for(p=A->next; p!=NULL; p=p->next) {
        min = p;//每一轮最小结点指向当前结点
        q = p->next;//从当前结点的下一个节点开始比较
        while(q) {
            if(q->data < min->data) {//如果工作结点比最小值还小
                min = q;
            }
            q = q->next;
        }
        tmp = p->data;
        p->data = min->data;
        min->data = tmp;
    }
}

4.测试用例

创建链表A,并定义数据元素数组a,然后循环创建每个结点,使用尾插法将每次创建的结点插入到链表中。

  • sizeof(a) / sizeof(a[0]): 用于计算数组a的数据个数,创建结点
  • 指针s: 用于指向每次创建的新结点
  • 指针tail: 指向链表的尾结点,初始指向头结点A

每次循环时创建新结点,然后将数据元素插入到新结点中,再使用尾插法将新结点插入到链表尾部,并修改tail指针指向新的尾结点。

 LinkList A = (LinkList)malloc(sizeof(LNode));
    int a[] = {4,5,3,1,2};
    LNode *s = NULL;
    LNode *tail = A;//tail指向尾结点
    //循环创建链表
    for(int i=0; i < sizeof(a) / sizeof(a[0]); i++) {
        s = (LNode *)malloc(sizeof(LNode));//创建新结点
        s->data = a[i];
        s->next = NULL;
        tail->next = s;
        tail = tail->next;
    }

测试结果如下:
简单选择排序升序

5.完整代码

#include <iostream>
using namespace std;

//定义结构体
typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;

//简单选择排序(升序)
void ChooseSort(LinkList &A) {
    //工作指针,min指向最小结点,p指向当前结点,q为工作指针,用于每轮的遍历
    LNode *min,*p,*q;
    int tmp;//暂存当前结点值,用于交换数据
    if(!A->next) {
        printf("链表为空!\n");
        return;
    }
    for(p=A->next; p!=NULL; p=p->next) {
        min = p;//每一轮最小结点指向当前结点
        q = p->next;//从当前结点的下一个节点开始比较
        while(q) {
            if(q->data < min->data) {//如果工作结点比最小值还小
                min = q;
            }
            q = q->next;
        }
        tmp = p->data;
        p->data = min->data;
        min->data = tmp;
    }
}

int main() {
    //创建单链表
    LinkList A = (LinkList)malloc(sizeof(LNode));
    int a[] = {4,5,3,1,2};
    LNode *s = NULL;
    LNode *tail = A;//tail指向尾结点
    //循环创建链表
    for(int i=0; i<sizeof(a) / sizeof(a[0]); i++) {
        s = (LNode *)malloc(sizeof(LNode));//创建新结点
        s->data = a[i];
        s->next = NULL;
        tail->next = s;
        tail = tail->next;
    }
    LinkList p = A->next;
    printf("A链表的数据为:\n");
    while(p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
    ChooseSort(A);
    LinkList q = A->next;
    printf("修改后后A链表的数据为:\n");
    while(q) {
        printf("%d\t", q->data);
        q = q->next;
    }

    return 0;
}
4022基于链表的简单选择排序 描述 试以单链表为存储结构,实现简单选择排序算法。 输入 多组数据,每组数据两行。第一行为序列的长度n,第二行为序列的n个元素(元素之间用空格分隔,元素都为正整数)。当n等于0时,输入结束。 输出 每组数据输出一行,为从小到大排序后的序列。每两个元素之间用空格隔开。 输入样例 1 5 4 5 3 2 9 6 1 3 5 7 9 2 0 输出样例 1 2 3 4 5 9 1 2 3 5 7 9 //基于链表的简单选择排序 #include <iostream> #de. 阅读详情

相关推荐

【数据结构】-排序-基于单链表的简单选择排序

方法一:不进行任何断链插入操作,找到目标节点之后,只是交换data值,这个思路很简单,与简单选择排序的思路一摸一样。 编程注意事项: min不能标记最小值,应该要标记最小值对应的链表节点 LinkList createLink(LinkList L) { cout << "尾插法创建单链表:"<<endl; int a; L = (LinkList)malloc(sizeof(LinkNode)); L->next = NULL; LinkNode *p=L,

vector的博客 1万+

C语言代码:基于单链表的简单选择排序算法

这段代码定义了一个 `ListNode` 结构体表示链表节点,以及相应的创建节点、插入节点、交换节点值等函数。然后,我们定义了 `selectionSort` 函数,它使用简单选择排序算法对链表进行排序。然后,我们打印排序前的链表,调用 `selectionSort` 函数对链表进行排序,并打印排序后的链表。// 链表为空或只有一个节点,无需排序。// 使用简单选择排序算法对链表进行排序。// 使用简单选择排序算法对链表进行排序。// 在链表末尾插入节点。// 交换链表节点的值。

m0_58464499的博客 2088

Nginx&&Keepalived(一)Keepalived介绍

一、背景: 案例1:如现有服务my-service-demo,希望实现高可用和负载均衡: 首先,my-service-demo服务部署在两台机器上,通过nginx去代理这两个节点,负载均衡就实现了。如果只有一个nginx,这台nginx机器一旦宕机,访问nginx会报错。这时候在另外一台机器nginx2上也安装nginx,并配置同样的代理,可以解决上述问题,但是暴露给用户的只有一个域名(或ip),不可能给用户提供两个域名,域名1(nginx机器1)访问不了了再让用户访问域名2(nginx机器2),这

w_t_y_y的博客 2885

基于链表的简单选择排序算法实现(C语言)

int val;} ListNode;这个C语言实现的链表选择排序展示了指针操作的技巧性。相比数组实现的选择排序,链表版本避免了大量数据移动的开销,但增加了指针操作的复杂性。选择排序虽然时间复杂度较高,但实现简单,适合用于教学和小规模数据排序。希望这篇博客能帮助你理解链表上的选择排序实现。如果有任何问题或建议,欢迎留言讨论!

guq511的博客 508

基于HPM5E00的EtherCAT从站开发实战:从硬件解析到软件调试

实时工业以太网通信是工业自动化与运动控制领域的核心技术,它通过硬件与协议栈的协同,实现了微秒级的高确定性数据交换。其技术价值在于为多轴同步、机器人控制等复杂场景提供了高实时性、高同步精度的通信基础。在应用场景上,广泛服务于数控机床、包装机械、半导体设备等高端制造领域。本文聚焦于EtherCAT从站开发,深入解析了基于先楫HPM5E00高性能MCU与专用从站控制器(ESC)的硬件架构设计,并详细阐述了开源协议栈SOES的移植、对象字典配置以及过程数据(PDO)映射等核心软件实践,为开发者快速构建稳定可靠的实时

weixin_30915951的博客 501

【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析

本文全面解析了STM32G070RBT6开发板从硬件设计到避坑的实战经验。详细介绍了电源设计、时钟电路、PCB布局等关键环节,分享了成本控制、焊接测试、软件开发和外设驱动的实用技巧,帮助开发者高效完成项目开发。

weixin_26897585的博客 237

【数据结构】A、B为递减有序的单链表,编写函数,将它们合并成递增有序的单链表,相同元素值只保留一个结点

文章目录1.算法思路2.定义结构体3.定义函数3.1 创建单链表3.2 合并单链表4.测试结果5.完整代码 1.算法思路 将两单链表合并,常用的方法是归并排序。每次比较两个链表的当前结点值,选择较大的结点值进行插入操作。 由于是将递减有序的链表变为递增有序的链表,那么可以考虑使用头插法,每次归并排序比较完成后将更大值的结点插入到已排序链表中,然后移动排序链表的头指针指向该结点。 2.定义结构体 typedef struct LNode { int data; struct LNode *

每天进步一点丶的博客 1612

VisionPro实战:5个工业视觉检测案例详解(附代码片段)

本文详细解析了VisionPro在工业视觉检测中的5个实战案例,包括PCB焊点质量检测、汽车齿轮尺寸测量、药品包装缺陷检测等。通过硬件配置方案和软件算法流程的详细介绍,帮助工程师快速掌握VisionPro的应用技巧,提升工业自动化检测效率。

weixin_29284657的博客 518

单链表的排序操作

第1关单链表的冒泡排序算法; 第2关单链表的选择排序算法。

qq_62949330的博客 907

程序自动化填写网页表单数据

如何让程序自动化填写网页表单数据,特别是涉及到批量数据情况时,可以减少人力。下面是涉及到的一些场景,都可以通过相关自动化程序实现。

Y 2427

Python在振动信号处理中的应用(一):振动信号消除多项式趋势项

文章目录一、概述二、最小二乘法去除趋势项原理三、python模块介绍3.1 scikitlearn简介(1)转化器(Transformer)(2)估计器(Estimator)3.2 线性回归LinearRegression3.3 多项式PolynomialFeatures3.4 工作流Pipeline四、python代码实现4.1 构造模拟信号4.2 编写去除趋势项主代码4.3 展示算法效果五、TIPS 一、概述   在振动测试过程中,传感器或采集设备由于自身性能问题或受环境干扰(如温度、供电等影响),容易

白银时代的博客 8578

数据结构编程练习(单链表)

1.基于链表的两个递增有序序列的合并 2.基于链表的两个非递减有序序列的合并 3.基于链表的两个集合的交集 4.基于链表的两个集合差集 5.查找链表中的最大值 6.链表的逆转 7.删除链表中满足区间值的结点 8.查找链表中倒数第k个结点 9.删除链表中倒数第k个结点 10.交换链表中相邻的两个结点 11.基于链表的简单选择排序 12.链表的分解 13.基于链栈的回文字符序列判断 14.奇偶链表的分割 15.基于链表的两数之和 16.删除链表中绝对值相等的结点

We choose to go to the moon in this decade and do the other things, not because they are easy, but beacase they are hard. 2477

MCU-内部flash模拟成EepRom(重新梳理)

通过fee写数据Data的过程中,数据会mapping一个虚拟地址,这个虚拟地址就是你的身份,在向flash写数据的过程中会写入很多相同虚拟地址的不同数据,在读取或切页的过程中,遍历数据只会认为最下面第一个的虚拟地址所持有的数据是有效数据,其他的都是老数据,可以丢弃。模拟成eeprom的两个eep_page写数据逻辑就是,先在eep_page0写数据,eep_page0写满后,将eep_page0的有效数据copy到eep_page1,之后擦eep_page0;

xiandang8023的博客 711

按递增次序输出带头结点的单链表中各结点的数据元素并释放元素所占的存储空间

不允许使用数组作为辅助空间 void Min_Del(LinkList &L) { while(L->next!=NULL) { q=L;//最小结点的前驱 p=L->next; while(p->next!=NULL) { if(p->next->data<q->next->data) q=p; p=p->next; } printf("%d",q->next->data);

vener_的博客 1906

Rancher入门到精通 - Nginx Ingress 配置指南

Rancher 是一个开源的容器管理平台,它提供了一套完整且易于使用的工具来部署、管理和扩展容器化应用。而 Nginx Ingress 则是一个常用的开源 Ingress 控制器,用于将外部请求流量导入到 Kubernetes 集群中的服务。在开始之前,请确保您已经正确安装了 Rancher 平台和 Nginx Ingress 控制器。

TechInk的博客 1311

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数据结构算法【考研】

目录: 1.1 统计出单链表HL中结点的值等于给定值X的结点数 2.1 设有一组初始记录关键字序列(K1,K2,… Kn),要求设计一个算法能够在 O(n) 的时间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于 Ki ,右半部分的每个关键字均大于等于 Ki 2.2 设有两个集合A和集合B,要求设计生成集合C=A∩B的算法,其中集合A、B和C用链式存储结构表示 3.1 设...

WU2629409421perfect的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数据结构及单链表例题(下)

这节课介绍的几道例题是考试中常考的,大家应好好理解.

qq_55383558的博客 1631

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据结构—单链表—直接插入排序

有一个带头节点的单链表L(至少有一个数据节点),设计一个程序使其元素呈递增有序排列 。 思路: 先构造一个只含有一个数据节点的有序表。然后扫描单链表L余下的节点*p(直到p为NULL为止),在有序表中通过比较找插入*p节点的前驱节点*pre,然后在*pre节点之后插入*p节点。 #include <iostream> using namespace std; #i...

LY_624的专栏 7431

给定一个带表头结点的单链表,设head为头指针, data 为整型元素, next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素, 并释放结点所占的存储空间

代码: void sortDel(LinkList* L){ LinkList *p,*pre,*minp,*minpre; LinkList* temp; while(L->next!=NULL){ p = L->next; pre = L; minpre = pre; minp = p; while(p!=NULL){ if(p->data < mi

江冷易水寒 6239

线性表练习之Example009-求两个有序递增链表的差集

已知递增有序的单链表A、B(A、B中元素个数分别为m、n,且A、B都带有头结点)分别存储了一个集合,请设计算法,以求出两个集合A和B的差集`A-B`(仅由在A中出现而不在B中出现的元素所构成的集合)。将差集保存在单链表A中,并保持元素的递增有序性。

二木成林 2438

数据结构排序

文章目录八、排序8.1、基本概念和排序方法概述8.1.1、排序的基本概念8.1.2、内部排序方法的分类8.1.3、待排序记录的存储方式8.2、插入排序8.2.1、直接插入排序   整本书的知识点,点击右方链接:整本书笔记知识点   八、排序 8.1、基本概念和排序方法概述 8.1.1、排序的基本概念 排序 :就是一系列数据,按照某个关键字(例如:销量,价格),进行递增或者递减的顺序排列起来 排序的稳定性 :能保证两个关键字相等的数,经过排序之后,其在序列的前后位置顺序不变.

chongyang_的博客 1万+

JAVA单链表的简单操作(递增单链表插入数据,链表逆置,链表逆序合成)

JAVA写一个单链表 1、已知带头结点的动态单链表 L 中的结点是按整数值递增排序的,试写一 算法将值为 x 的结点插入到表 L 中,使 L 仍然有序。要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。 2、设计一算法,逆置带头结点的动态链表 L。要求利用原表的结点空间, 并要求用尽可能少的时间完成。 3、假设有两个按元素值递增有序的线性表 A 和 B,均以单链表作存...

qq_44095715的博客 1283

单链表实现递增排序2021-04-07

#include<iostream> #include<malloc.h> # define size 50 using namespace std; typedef struct link { int data; link *next; }linklist; void creat(linklist *&p) { p=(linklist *)malloc(sizeof(linklist)); p->next=NULL; } void store(linklist

qq_50887722的博客 441

假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。

【代码】假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。

thq_kuqi的博客 431

中国农业大学数据结构期末复习算法题

文章目录一、线性表1、已知p指向双向循环链表中的一个结点,交换p所指向的结点及其前驱结点的顺序。2、HL是单链表的头指针,试写出删除头结点的算法。3、统计出单链表HL中结点的值等于给定值X的结点数。4、将一个结点类型为Lnode的单链表按逆序链接。5、判断单链表中结点是否关于中心对称。二、栈和队列三、数组和广义表四、树和二叉树1、在链式存储结构上建立一棵二叉树。2、判断一棵二叉树是否是二叉排序树。五、图六、查找七、排序1、对一整型数组b[n]中的元素进行重新排列,将所有负数均调整到数组的低下标端,将所有正.

weixin_43557723的博客 7487

从零开始学数据结构系列之第六章《排序简介》

​所谓排序,就是使一串数据,按照其中的某个或某些关键字的大小,递增或递减排列起来的操作。

铁匠匠匠的博客 1517
上一篇: 【数据结构】已知A和B两个带头结点的递增链表,将A删减使其成为A与B的交集,并递减有序
下一篇: 【数据结构】调整数据元素为(a1,a2,...,an)的单链表,使得数据元素次序为(a1,a3,...an,...,a4,a2),要求T(n)=O(n)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步一点丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值