C语言 指针(5)

目录

1.冒泡排序

2.二级指针

3.指针数组

4.指针数组模拟二级数组


1.冒泡排序

1.1 基本概念

冒泡排序(Bubble Sort) 是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元

素,如果它们的顺序错误就把它们交换过来。这个算法的名字由来是因为越小(或越大)的元素会

经由交换慢慢“浮”到数列的顶端 。

 如果概念比较抽象的话,我们可以举个例子理解一下:

假设有5个小朋友排队,身高从矮到高排才算整齐。老师像冒泡排序程序,每次从队头开始,让相

邻小朋友比身高,高的往后站。第一轮,最高的小朋友像大泡泡浮到队尾;第二轮,第二高的小朋

友再浮到倒数第二位置,依此类推,经过4轮,小朋友们就按身高排好队啦。

1.2 算法原理

冒泡排序的核心思想是通过重复遍历待排序的数组,比较相邻元素的大小,若逆序则交换它们的位

置。这样,每次遍历都会将未排序序列中最大(或最小)的元素“冒泡”到序列的尾部(或头部)。

随着遍历次数的增加,需要排序的元素逐渐减少,直至完成排序。

1.3 代码示例

1  //方法1
2  void bubble_sort(int arr[], int sz)//参数接收数组元素个数
3  {
4      int i = 0;
5      for(i=0; i<sz-1; i++)
6      {
7          int j = 0;
8          for(j=0; j<sz-i-1; j++)
9          {
10             if(arr[j] > arr[j+1])
11             {
12                 int tmp = arr[j];
13                 arr[j] = arr[j+1];
14                 arr[j+1] = tmp;
15             }
16          }
17      }
18  }
19
20  int main()
21  {
22      int arr[] = {3,1,7,5,8,9,0,2,4,6};23      int sz = sizeof(arr)/sizeof(arr[0]);
24      bubble_sort(arr, sz);
25      int i = 0;
26      for(i=0; i<sz; i++)
27      {
28          printf("%d ", arr[i]);
29      }
30      return 0;
31  }
32
33
34  //方法2 - 优化
35  void bubble_sort(int arr[], int sz)//参数接收数组元素个数
36  {
37      int i = 0;
38      for(i=0; i<sz-1; i++)
39      {
40          int flag = 1;//假设这一趟已经有序了
41          int j = 0;
42          for(j=0; j<sz-i-1; j++)
43          {
44             if(arr[j] > arr[j+1])
45             {
46                 flag = 0;//发生交换就说明,无序
47                 int tmp = arr[j];
48                 arr[j] = arr[j+1];
49                 arr[j+1] = tmp;
50             }
51          }
52          if(flag == 1)//这一趟没交换就说明已经有序,后续无序排序了
53              break;
54      }
55  }
56
57  int main()
58  {
59      int arr[] = {3,1,7,5,8,9,0,2,4,6};
60      int sz = sizeof(arr)/sizeof(arr[0]);
61      bubble_sort(arr, sz);
62      int i = 0;
63      for(i=0; i<sz; i++)
64      {
65          printf("%d ", arr[i]);
66      }
67      return 0;
68  }

1.4 代码原理

方法1

- 函数定义: bubble_sort 函数接收整型数组 arr 和数组元素个数 sz ,实现冒泡排序。

- 外层循环: for(i = 0; i < sz - 1; i++) 控制排序轮数, sz 个元素需 sz - 1 轮 。

- 内层循环: for(j = 0; j < sz - i - 1; j++) 进行每轮元素比较,每轮把最大元素“冒泡”到末尾。

- 比较交换: if(arr[j] > arr[j + 1]) 判断相邻元素大小,若逆序则借助 tmp 交换。

- 主函数:定义数组 arr ,计算元素个数 sz ,调用 bubble_sort 排序,再遍历打印排序后数组。

 
方法2(优化)

 - 函数定义:同方法1的 bubble_sort 函数功能。

- 外层循环:与方法1类似控制轮数。

- 内层循环:逻辑同方法1,新增 flag 变量。初始设 flag = 1 (假设有序 ,发生交换时 flag= 0 (说明无序 )。

- 提前结束:内层循环后 if(flag == 1) 判断,若没交换说明已排好序, break 提前结束排序。

- 主函数:和方法1主函数类似,定义数组、计算元素个数、调用排序函数并打印结果。

2. 二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?

这就是 二级指针 。

对于二级指针的运算有:

 *ppa  通过对 ppa 中的地址进行解引用,这样找到的是  pa  , *ppa  其实访问的就是  pa  

int b = 20;
*ppa = &b; //等价于 pa = &b;

**ppa  先通过  *ppa  找到  pa ,然后对  pa  进行解引用操作: *pa  ,那找到的是  a  。
 

**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

3. 指针数组

指针数组是指针还是数组?

我们类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组

那指针数组呢?是存放指针的数组。

指针数组的每个元素都是用来存放地址(指针)的。

如下图:


指针数组的每个元素是地址,又可以指向一块区域。

4. 数组指针模拟二维数组

#include <stdio.h>
int main()
{int arr1[] = {1,2,3,4,5};int arr2[] = {2,3,4,5,6};int arr3[] = {3,4,5,6,7};//数组名是数组首元素的地址,类型是int*的,就可以存放在parr数组中int* parr[3] = {arr1, arr2, arr3};int i = 0;int j = 0;for(i=0; i<3; i++){for(j=0; j<5; j++){printf("%d ", parr[i][j]);}printf("\n");}return 0;
}

parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j] 就是整型一

维数组中的元素。

上述的代码模拟出二维数组的效果,实际上并非完全是二维数组,因为每一行并非是连续的。

感谢大家的观看,本期内容到此结束,希望大家对冒泡排序多多理解!

 

 

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

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

相关文章

15前端项目----用户信息/导航守卫

登录/注册 持久存储用户信息问题 退出登录导航守卫解决问题 持久存储用户信息 本地存储&#xff1a;&#xff08;在actions中请求成功时&#xff09; 添加localStorage.setItem(token,result.data.token);获取存储&#xff1a;&#xff08;在user仓库中&#xff0c;state中tok…

RSS 2025|斯坦福提出「统一视频行动模型UVA」:实现机器人高精度动作推理

导读 在机器人领域&#xff0c;让机器人像人类一样理解视觉信息并做出精准行动&#xff0c;一直是科研人员努力的方向。今天&#xff0c;我们要探讨的统一视频行动模型&#xff08;Unified Video Action Model&#xff0c;UVA&#xff09;&#xff0c;就像给机器人装上了一个“…

基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(四)

上一篇介绍了基于SmartETL框架实现arxiv采集处理的基本流程&#xff0c;通过少量的组件定制开发&#xff0c;配合yaml流程配置&#xff0c;实现了复杂的arxiv采集处理。 由于其业务流程复杂&#xff0c;在实际应用中还存在一些不足需要优化。 5. 基于Kafka的任务解耦设计 5.…

Fiori学习专题三十五:Device Adaptation

由于在类似于手机的小面板上显示时&#xff0c;我们为了留出更多空间展示数据&#xff0c;可以将一些控件折叠。 1.修改HelloPanel.view.xml&#xff0c;加入expandable“{device>/system/phone}” expanded"{ !${device>/system/phone} <mvc:ViewcontrollerNam…

【记录】HunyuanVideo 文生视频工作流

HunyuanVideo 文生视频工作流指南 概述 本指南详细介绍如何在ComfyUI中使用腾讯混元HunyuanVideo模型进行文本到视频生成的全流程操作&#xff0c;包含环境配置、模型安装和工作流使用说明。 参考&#xff1a;https://comfyui-wiki.com/zh/install/install-comfyui/install-c…

统一返回JsonResult踩坑

定义了一个统一返回类&#xff0c;但是没有给Data 导致没有get/set方法&#xff0c;请求一直报错 public class JsonResult<T> {private int code;private String message;private T data;public JsonResult() {}public JsonResult(int code, String message, T data) {…

dubbo-token验证

服务提供者过滤器 import java.util.Map; import java.util.Objects;/*** title ProviderTokenFilter* description 服务提供者 token 验证* author zzw* version 1.0.0* create 2025/5/7 22:17**/ Activate(group CommonConstants.PROVIDER) public class ProviderTokenFilt…

沃伦森电气高压动态无功补偿装置助力企业电能优化

在工业生产的复杂电能环境中&#xff0c;电能质量直接影响企业的生产效率和运营成本。XX光伏科技有限公司作为一家快速发展的制造企业&#xff0c;随着生产规模的不断扩大&#xff0c;其内部电网面临功率因数过低、电压波动频繁等问题&#xff0c;导致供电部门罚款增加、设备故…

基于EFISH-SCB-RK3576工控机/SAIL-RK3576核心板的网络安全防火墙技术方案‌(国产化替代J1900的全栈技术解析)

‌基于EFISH-SCB-RK3576/SAIL-RK3576的网络安全防火墙技术方案‌ &#xff08;国产化替代J1900的全栈技术解析&#xff09; ‌一、硬件架构设计‌ ‌流量处理核心模块‌ ‌多核异构架构‌&#xff1a; ‌四核Cortex-A72&#xff08;2.3GHz&#xff09;‌&#xff1a;处理深度…

Maven 动态版本与SNAPSHOT机制详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

趣味编程:答案之书

概述&#xff1a;该篇博客主要介绍的是曾经一度风靡全网的答案之书小程序。 目录 1. 效果展示 2. 源码展示 3. 代码逻辑详解 3.1 头文件与全局变量 3.2 main函数 3.3 主循环 3. 4 绘制界面 4. 运行问题 5.小结 1. 效果展示 该小程序是动态的效果&#xff0c; 因此实…

多线程初阶(2)

说到多线程编程&#xff0c;一定少不了线程安全这个话题。我们前面了解了线程的原理以及线程与进程的关系。线程之间共享资源&#xff0c;这就代表了在多线程编程中一定会产生冲突&#xff0c;所以我们需要在敲代码时保证线程安全&#xff0c;避免这样的问题发生。 我们先看一…

【Ubuntu】安裝向日葵远程控制

前言 在Ubuntu 24.04.2下安装向日葵远程控制出错&#xff0c;少了一些依赖&#xff0c;需要安装一些依赖。 1.安装gconf2-common wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gconf/gconf2-common_3.2.6-6ubuntu1_all.deb sudo dpkg -i gconf2-common_3.2.6-6ub…

【Python开源】深度解析:一款高效音频封面批量删除工具的设计与实现

&#x1f3b5; 【Python开源】深度解析&#xff1a;一款高效音频封面批量删除工具的设计与实现 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热情…

JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码

一、源码描述 这是一套房屋租售管理源码&#xff0c;基于SpringBootVue框架&#xff0c;后端采用JAVA开发&#xff0c;源码功能完善&#xff0c;涵盖了房屋租赁、房屋销售、房屋交易等业务。 二、源码截图

一篇文章讲清楚mysql的聚簇索引、非聚簇索引、辅助索引

聚簇索引与非聚簇索引最大的区别就是&#xff1a; 聚簇索引的索引和数据是存放在一起的&#xff0c;都是在叶子结点&#xff1b; 非聚簇索引的索引和数据是分开存储的&#xff0c;叶子节点存放的是索引和指向数据文件的地址&#xff0c;通过叶子节点找到索引&#xff0c;再通…

使用ESPHome烧录固件到ESP32-C3并接入HomeAssistant

文章目录 一、安装ESPHome二、配置ESP32-C3控制灯1.主配置文件esp32c3-luat.yaml2.基础通用配置base.yaml3.密码文件secret.yaml4.围栏灯four_light.yaml5.彩灯rgb_light.yaml6.左右柱灯left_right_light.yaml 三、安装固件四、HomeAssistant配置ESPHome1.直接访问2.配置ESPHom…

什么是变量提升?

变量提升&#xff08;Hoisting&#xff09; 是 JavaScript 引擎在代码执行前的一个特殊行为&#xff0c;它会将变量声明和函数声明自动移动到当前作用域的顶部。但需要注意的是&#xff0c;只有声明会被提升&#xff0c;赋值操作不会提升。 ​​核心概念​​ 变量声明提升&…

【万字长文】深入浅出 LlamaIndex 和 LangChain:从RAG到智能体,轻松驾驭LLM应用开发

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用

一、创建请求封装目录 选中自己的项目&#xff0c;右键鼠标---->新建---->目录---->名字自定义【我的是api】 二、创建两个js封装文件 选中封装的目录&#xff0c;右键鼠标---->新建---->js文件---->名字自定义【我的两个js文件分别是my_http和my_api】 三…