当前位置: 首页 > ops >正文

初识c语言————排序方法

今天我们学习的是c语言中的排序方法


目录:

一.冒泡排序法

二.选择排序法


下面我们正式学习c语言中的排序方法

一.冒泡排序法

1.冒泡排序法的过程:

                                  将无序的数组通过数组之间的大小比较,排成有序的样子

2.例如:5,3,4,6  --->>3,5,4,6 --->>3,4,5,6 --->>3,4,5,6

             

第一轮排序(将最大值放到末尾)
1. 比较 [**5**, **3**, 4, 6]`→ 5 > 3 → 交换  
→ 数组变为 `[3, 5, 4, 6]`  
2. 比较 [3, **5**, **4**, 6] → 5 > 4 → 交换  
→ 数组变为 `[3, 4, 5, 6]`  
3. 比较 [3, 4, **5**, **6**]→ 5 < 6 → 不交换 

结果:[3, 4, 5, 6](最大值 6 已在末尾)

---

第二轮排序(检查剩余部分)
1. 比较 [**3**, **4**, 5, 6] → 3 < 4 → 不交换 
2. 比较 [3, **4**, **5**, 6] → 4 < 5 → 不交换 

结果:[3, 4, 5, 6](无交换,排序完成)

---

最终结果:[3, 4, 5, 6]

3.注意:

           ***若数组中有n个元素,那么需要进行n-1次排序(考虑最坏的情况)

           ***因为每次排序是为了将最值放在数组末尾,所以每次排序只需进行n-a-1次比较(减少不必要的比较)

   代码:

#include <stdio.h>void maopao(int num[],int n)
{for(int a=0;a<n-1;a++){for(int b=0;b<n-a-1;b++){if(num[b]>num[b+1]){int temp=num[b+1];num[b+1]=num[b];numb[b]=temp;}}}
}void prinmao(int num[],int n)
{for(int a=0;a<=n-1;a++){ printf("%d",num[a];}
}int main()
{int num[]={2,6,7,9};int n=sizeof(num)/sizeof(num[0]);maopao(num,n);prinmao(num,n);
}

   代码解析:

1.maopao函数是一个让数组进行冒泡排序的函数

   prinmao函数是一个打印数组的函数

2.n是指num这个函数中元素的个数

   所以对num进行冒泡排序只需进行n-1个排序

3.因为每次的排序会把最值放在末尾,所以为了节省空间,只需进行n-a-1个比较

4.因为在我们进行冒泡排序的时候比较方法是这种形式:num[b]>num[b+1],所以我们在进行二次循环的时候应该是b<n-a-1,而不是b<=n-a-1,这样的目的是为了防止数组的下标溢出,而使用b<n-a-1也能保证每个数都参与了比较

二.选择排序法

1.选择排序法的过程: 

                                 假设第1个元素是最值,求第1个元素后面所有元素中比这个元素更最的值,将这个值与第1个元素进行值互换,然后在进行第二个元素,第三个元素------

2.例如:2,4,10,9 --->>10,4,2,9 --->>10,9,2,4 --->>10,9,4,2

第1轮排序**(i=0)
- **未排序部分**:`[**2**, 4, 10, 9]`
- 当前最小值:`2`(索引0)
- 比较过程:
- 2 < 4 → 保持
- 2 < 10 → 保持
- 2 < 9 → 保持
- **无需交换**(最小值已在正确位置)

**本轮结果**:`[**2**, 4, 10, 9]`  
(已排序部分:`[2]`,未排序部分:`[4, 10, 9]`)

---

第2轮排序**(i=1)
- **未排序部分**:`[2, **4**, 10, 9]`
- 当前最小值:`4`(索引1)
- 比较过程:
- 4 < 10 → 保持
- 4 < 9 → 保持
- **无需交换**(最小值已在正确位置)

**本轮结果**:`[2, **4**, 10, 9]`  
(已排序部分:`[2, 4]`,未排序部分:`[10, 9]`)

---

第3轮排序**(i=2)
- **未排序部分**:`[2, 4, **10**, 9]`
- 当前最小值:`10`(初始索引2)
- 比较过程:
- 10 > 9 → 更新最小值为 `9`(索引3)
- **交换 10 和 9**:
```c
temp = 10;
arr[2] = 9;
arr[3] = 10;

**本轮结果**:`[2, 4, **9**, 10]`  
(已排序部分:`[2, 4, 9]`,未排序部分:`[10]`)

### **最终结果**:`[2, 4, 9, 10]`  
(第4轮无需执行,因为最后一个元素自动就位)

3.注意:

            ***若数组中有n个元素,那么只需进行n-1次排序,因为最后一个元素自动就位

            ***因为选择排序是把最值放在数组的前面,所以选择的元素下标是a+1,为了保证最后一个元素参与了比较,所以第二个循环c<n

   代码:

#include <stdio.h>void xuanze(int num[],int n)
{for(int a=0;a<n-1;a++){int b=a;for(int c=a+1,c<n;c++){  if(num[b]>num[c])b=c;}int temp=num[a];num[a]=num[b];num[b]=temp;}
}void prinxuan(int num[],n)
{for(int a=0;a<=n-1;a++)printf("%d",num[a];
}int mian()
{int num[]={2,10,4,9};int n=sizeof(num)/sizeof(num[0]);xuanze(num,n);prinxuan(num,n);
}

   代码解析:

1.xuanze函数是一个将数组进行选择排序的函数

   prinxuan函数是一个打印数组的函数

2.n是指数组中的元素的个数

   所以选择排序只需进行n-1个排序

3.因为选择排序选择的数是根据排序次数来递进的,所以每个标准数要从c=a+1开始

http://www.xdnf.cn/news/17673.html

相关文章:

  • 闹钟时间到震动与声响提醒的实现-库函数版(STC8)
  • springboot接口请求参数校验
  • 力扣121:买卖股票的最佳时机
  • I2c、SPI、USB驱动架构类比
  • 管理变量和事实
  • 【Unity3D】Spine黑线(预乘问题)、贴图边缘裁剪问题
  • @系统管理 - Ansible 补丁管理方案(Windows Linux)
  • 飞算JavaAI的“盾牌”计划:手撕Spring Security + JWT认证链
  • CNN卷积神经网络预测手写数字的Pytorch实现
  • C++ 优选算法 力扣 209.长度最小的子数组 滑动窗口 (同向双指针)优化 每日一题 详细题解
  • [系统架构设计师]架构设计专业知识(二)
  • python与JavaScript的区别
  • 三方相机问题分析六:【没用相机,诡异的手电筒不可使用】下拉状态栏,手电筒置灰,无法打开,提提示相机正在使用
  • 模型驱动的自动驾驶AI系统全生命周期安全保障
  • 论文Review 激光SLAM VoxelMap | RAL 2022 港大MARS出品!| 经典平面特征体素激光SLAM
  • .NET 应用程序 Linux下守护进程脚本编写
  • 基于.Net Framework4.5 Web API 引用Swagger
  • JavaWeb核心:HttpServletRequest与HttpServletResponse详解
  • mac环境下安装git并配置密钥等
  • 从行业场景到视觉呈现:3ds Max 与 C4D 效果图的本质分野
  • Pycharm现有conda环境有对应env,但是添加后没反应
  • 学习嵌入式的第十九天——Linux——文件编程
  • Spring Boot 使用 @NotBlank + @Validated 优雅校验参数
  • 疯狂星期四文案网第38天运营日记
  • TorchDynamo - API
  • 互联网大厂Java求职面试实录:Spring Boot到微服务与AI的技术问答
  • 【Unity开发】Unity核心学习(一)
  • 如何在 Ubuntu 24.04 LTS Noble Linux 上安装 FileZilla Server
  • MyBatis 中 XML 与 DAO 接口的位置关系及扫描机制详解
  • react与vue的对比,来实现标签内部类似v-for循环,v-if等功能