C语言知识点复习------排序法(冒泡、选择、插入)与链表

news2025/2/25 12:52:14

目录

排序

冒泡排序:

选择排序:

插入排序:

链表

单链表的建立

 单向循环链表的建立

双向循环链表


排序

冒泡排序:

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

 算法:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 代码实现:

#include<stdio.h>
int main()
{
	int a[100];
	int i = 0;
	int k = 0;
	while (1)//输入一个数组,如果回车之后就结束输入,进行排序
	{
		scanf("%d", &a[i]);
		i++;
		k++;
		char b = getchar();
		if (b == '\n')
			break;
	}
	for (i = 0; i < k - 1; i++)
	{
		for (int j = 0; j < k - i - 1; j++)
		{
			if (a[j] > a[j + 1]) {
				/*int n = a[j];//传统的数字交换
				a[j] = a[j + 1];
				a[j + 1] = n;*/

				a[j] = a[j] ^ a[j + 1];//通过异域进行数字交换
				a[j + 1] = a[j] ^ a[j + 1];
				a[j] = a[j] ^ a[j + 1];
			}


		}
	}
	for (int i = 0; i < k; i++)
		printf("%d ", a[i]);
}

选择排序:

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

代码实现:

#include<stdio.h>
int main()
{
	int a[100];
	int i = 0;
	int k = 0;
	while (k < 100)
	{

		scanf("%d", &a[i]);
		i++;
		k++;
		char b = getchar();
		if (b == '\n')
			break;
	}
	for (i = 0; i < k - 1; i++)
	{
		for (int j = i + 1; j < k; j++)
		{
			if (a[i] > a[j])
			{
                /*int n = a[j];//传统的数字交换
				a[j] = a[j + 1];
				a[j + 1] = n;*/

				a[i] = a[i] ^ a[j];
				a[j] = a[i] ^ a[j];
				a[i] = a[i] ^ a[j];
			}
		}
	}
	for (int i = 0; i < k; i++)
		printf("%d ", a[i]);
}

插入排序:

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中

代码实现

#include<stdio.h>
int main()
{
	int a[100];
	int i = 0;
	int k = 0;
	while (k < 100)
	{

		scanf("%d", &a[i]);
		i++;
		k++;
		char b = getchar();
		if (b == '\n')
			break;
	}
	for (i = 1; i < k; i++)
	{
		int temp = a[i];
		for (int j = i - 1; j >= 0 && a[j] > temp; j--)
		{
			a[j + 1] = a[j];
			a[j] = temp;
		}
	}
	for (int i = 0; i < k; i++)
		printf("%d ", a[i]);
}

链表

链表概念
        链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作。      

如果想了解更多就看看这个

C语言 链表输入输出数组_c语言链表数据输入_守约斯维奇的博客-CSDN博客

单链表的建立

#include<stdio.h>
#include<stdlib.h>
struct a//定义结构体,结构体成员可以自行添加
{
	int x;
	struct a* next;
};
struct a* head(int n)//这个n表示要创建几个节点
{
	struct a* head, * tail, * p;
	head = tail = p = NULL;
	int i = 0;
	while (i < n)
	{
		p = (struct a*)malloc(sizeof(struct a));
		p->x = i;//这里可以对链表节点数据域进行赋值或者初始化
		if (head == NULL)
			head = p;
		else
			tail->next = p;
			tail = p;
             i++;
			return head;
	}
}

 单向循环链表的建立

其实单向循环链表也没什么多的,其实就是在单链表的基础上,把最后一个节点指向头节点就行了

#include<stdio.h>
#include<stdlib.h>
struct a//定义结构体,结构体成员可以自行添加
{
	int x;
	struct a* next;
};
struct a* head(int n)//这个n表示要创建几个节点
{
	struct a* head, * tail, * p;
	head = tail = p = NULL;
	int i = 0;
	while (i < n)
	{
		p = (struct a*)malloc(sizeof(struct a));
		p->x = i;//这里可以对链表节点数据域进行赋值或者初始化
		if (head == NULL)
			head = p;
		else
			tail->next = p;
			tail = p;
            p->next=head;//把每次创建的一个节点的next指向头就行了
            i++;
			return head;
	}
}

双向循环链表

跟单向链表不同的是,双向链表多了个前指针,也就是last,这个指向上一个节点,其实建立起来也是不难的,代码如下:

#include<stdio.h>
#include<stdlib.h>
struct a//定义结构体,结构体成员可以自行添加
{
	struct a* last;
	int x;
	struct a* next;
};
struct a* head(int n)//这个n表示要创建几个节点
{
	struct a* head, * tail, * p;
	head = tail = p = NULL;
	int i = 0;
	while (i < n)
	{
		p = (struct a*)malloc(sizeof(struct a));
		p->x = i;//这里可以对链表节点数据域进行赋值或者初始化
		if (head == NULL)
			head = p;
		else {
			p->last = tail;//把这个新创建的节点last指针指向上一个节点就行了
			tail->next = p;
		}
		p->next = head;
		head->last = p;//头节点的上一个就指向新建的节点就行了
			tail = p;
			i++;
			return head;
	}
}

好了就到这吧,这是C语言知识点复习篇

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

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

相关文章

RK356X系列(RK3568)GL857L芯片 USB驱动开发

首先我们先区分一下USB几种控制器类型协议 OHCI UHCI EHCI xHCI。OHCI、UHCI都是USB1.1的接口标准&#xff0c;而EHCI是对应USB2.0的接口标准&#xff0c;最新的xHCI是USB3.0的接口标准。1. OHCI&#xff08;Open Host Controller Interface&#xff09;是支持USB1.1的标准&…

C++ | 数据结构与算法 | 单源最短路径 | Dijkstra Bellman Ford

文章目录前言Dijkstra算法讲解与实现Bellman Ford算法与实现前言 &#xff08;关于代码实现的图结构&#xff0c;可以看图结构的实现这篇文章&#xff09; Dijkstra的实现与Prim的实现相似&#xff0c;两者都是通过贪心思想实现&#xff0c;它们有什么不同呢&#xff1f;首先…

数字IC设计工程师一般都干什么

数字IC设计工程师一般都干什么 简单来说&#xff0c;数字IC设计工程师一般就是负责写verilog代码&#xff08;当然&#xff0c;不是仅仅写个代码&#xff09;。本文主要对数字IC设计的工作流程进行简单的介绍&#xff0c;也算是对我从业一年来的总结。 一般来说&#xff0c;数…

linux下的僵尸进程处理SIGCHLD信号

阅读目录 对于waitpid的p i d参数的解释与其值有关&#xff1a;wait与waitpid区别&#xff1a; 转自&#xff1a;linux下的僵尸进程处理SIGCHLD信号 - Jessica程序猿 - 博客园 什么是僵尸进程&#xff1f; 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区&am…

Java——字母大小写全排列

题目链接 字母大小写全排列 题目描述 给定一个字符串 s &#xff0c;通过将字符串 s 中的每个字母转变大小写&#xff0c;我们可以获得一个新的字符串。 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。 题目示例 输入&#xff1a;s “a1b2” 输出&#xff1a…

spring-boot国际化i18n中英文实现

一、背景 接触到的项目&#xff0c;使用国际化越来越多&#xff0c;系统页面实现中英文环境&#xff0c;记录下&#xff0c;前端使用vue vue-i8n 后端java自己封装 前端翻译对象&#xff1a;页面涉及到的所有按钮&#xff08;包括新增、删除、导出、下载、导入、上一页、下…

相控阵天线分析综合、设计与测试

目录概述HFSS特殊曲线天线建模直线阵列天线特性和阵列因子&#xff08;方向图乘积定理、波束扫描&#xff09;非规则直线阵列天线&#xff08;稀布阵列、稀疏阵列、平方率分布阵列&#xff09;直线阵列天线低副瓣综合&#xff08;切比雪夫、泰勒分布、SinZ-Z和Villeneuve分布&a…

2023-java面试最新总结

1. Java中的原始数据类型都有哪些&#xff0c;它们的大小及对应的封装类是什么&#xff1f; boolean boolean数据类型非true即false。这个数据类型表示1 bit&#xff0c;但是它的大小并没有精确定义。 《Java虚拟机规范》中如是说&#xff1a;“虽然定义了boolean这种数据类型…

胡歌官宣生女,胡椒粉们真为他高兴,人生最顶级的能力是【涅槃重生】的力量

今天刷到胡歌官宣生女&#xff0c;胡歌当父亲了&#xff0c;真为他高兴。恭喜老胡&#xff01;&#x1f389;作为十多年胡椒粉&#xff0c;连夜录制了这个视频&#xff08;抖音视频号&#xff1a;【小伍说_523的作品】胡歌官宣生女&#xff0c;十几年的胡椒粉真替他高兴&#x…

Unity二

一、脚本的创建 可以在project视图中的Assets文件夹中右键创建一个C#脚本&#xff0c;可以将脚本分类放在不同的文件夹中&#xff0c;或者点击游戏对象后在Inspector视图中找到最下方的添加组件按钮&#xff0c;然后点击新建脚本即可。若在project视图中创建的脚本&#xff0c…

详解HTTP请求行

请求行格式 request-linemethod SP request targe SP HTTP-version CRLFrequest-target 有四种格式 origin-formabsolute-path&#xff1a;向原服务器&#xff0c;也就是实际响应内容的服务器发起请求的&#xff0c;path为空时&#xff0c;必须传递 /absolute-formabsolute…

应用性能监控对系统慢访问分析案例

背景 某港口综合管控系统是其主要的业务系统&#xff0c;最近发现用户反馈出现访问响应慢的情况。 该港口已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量。本次分析重点针对综合管控业务系统性能进行分析&#xff0c;以供安全取证、性能分析…

C# 国际化问题之CultureInfo(小数点的不同一些欧洲国家习惯使用,而非.)

前言 在公司做的桌面软件在国内以及亚美洲地区都能正常使用&#xff0c;结果到了俄罗斯客户那边软件就根本打不开&#xff0c;不能正常使用。 文章目录定位问题分析问题找解决方案总结定位问题 经定位排查&#xff0c;最终发现是俄罗斯的浮点数不是用小数点&#xff0c;而是用…

网赚 美金 Neobux注册操作完整教程

neobux是点击网赚即时支付&#xff08;Instant pay&#xff09;型的创始网站&#xff0c;同时也是点击网赚类网站中信誉最高、实力最强&#xff0c;会员最多、最稳定的。Neobux官网 https://www.neobux.com/?rxyadmin账户注册1.点击官网地址进入neobux主站&#xff0c;点击右上…

【正点原子FPGA连载】第二十五章设备树下的LED驱动实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十五章设备树…

BUUCTF[GXYCTF2019]Ping Ping Ping 1

题目 http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/ 解题过程 1.尝试ping一下127.0.0.1 http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/?ip127.0.0.1 2.尝试查看当前目录下的内容 http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node…

vue项目采用vue-cli-plugin-cesium 插件集成cesium

市面上的前端框架中&#xff0c;VueCesium 可谓是最佳搭档&#xff0c;一般做 Cesium B 端产品的公司都会使用 Vue&#xff0c;所以后续内容都将基于 Vue通常情况下&#xff0c;我们要在 Vue 中使用 Cesium&#xff0c;首先要安装 Cesium&#xff0c;然后要在 vue-cli 的 webpa…

涂鸦发布蓝牙子设备框架,让智能家居快速实现毫秒级配网速度

如果有人问智能家居行业应用最广的协议是什么&#xff1f;蓝牙一定是选项之一。体积小便于集成、功耗低、全球适用等特征&#xff0c;让蓝牙设备被大范围应用。在消费侧则更关心的问题是&#xff1a;设备的配网速度、成功率以及设备连接的稳定性。 所以&#xff0c;市场要找到…

26对称矩阵及正定性

一、知识概要 本节从对称矩阵的特征值&#xff0c;特征向量入手&#xff0c;介绍对称矩阵在我们之前学习的一些内容上的特殊性质。并借此引出了正定矩阵。 二、对称矩阵 正如我们之前学习的很多特殊矩阵一样&#xff08;如马尔科夫矩阵&#xff09;&#xff0c;对称矩阵也有…

字符串流stringstream--<sstream>

字符串流stringstream流详解 一.stringstream是C提供的一个字符串流&#xff0c;与iostream和fstream的操作方法类似&#xff0c;只是功能不同。要使用字符串流必须包含其头文件<sstream>。 #include<sstream> 二.stringstream字符串流通常用来做数据转换&#x…