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

【C语言】排序方法

前言:

在本章节为大家提供一些C语言排序的方法,供大家使用。

本文将详细介绍三种基础排序方法:冒泡排序、选择排序和插入排序

一·冒泡排序 

算法原理:

冒泡排序是最简单的排序算法之一,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

冒泡排序的核心思想是通过相邻元素之间的比较和交换,将最大(或最小)的元素逐步 "冒泡" 到数组的末尾。

具体步骤如下:

  1. 比较相邻的元素。如果第一个比第二个大,就把它们交换过来。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  5. 外层循环(for i:控制排序的轮数。对于长度为n的数组,需要进行n-1轮,因为每轮会确定一个元素的最终位置。
  6. 内层循环(for j:负责每一轮中的元素比较和交换。具体作用如下:
    • 比较相邻元素:通过j的递增,依次比较arr[j]arr[j+1]
    • 交换条件:如果前一个元素大于后一个元素(即arr[j] > arr[j+1]),则交换它们。
    • 减少比较次数:每完成一轮,最大的元素已在正确位置,因此下一轮可以减少一次比较(通过n-1-i实现)。

完整代码

#include <stdio.h>// 冒泡排序函数void bubbleSort(int arr[], int n) 
{int i, j, temp;for (i = 0; i < n - 1; i++) {// 最后i个元素已经就位for (j = 0; j < n - i - 1; j++){if (arr[j] > arr[j + 1]) {// 交换元素temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}// 打印数组函数
void printArray(int arr[], int size)
{int i;for (i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}// 主函数
int main()
{int arr[] = {11,33,3,0,11111,77,44 };int n = sizeof(arr) / sizeof(arr[0]);printf("排序前的数组: \n");printArray(arr, n);bubbleSort(arr, n);printf("排序后的数组: \n");printArray(arr, n);return 0;
}

 如果想要从小到大的排序。仅仅把比较部分的小于改成大于即可。

二·选择排序

算法原理

选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

具体步骤如下:

  1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  2. 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。

完整代码

#include <stdio.h>void selectionSort(int arr[], int n) 
{for (int i = 0; i < n - 1; i++) {int min = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[min])min = j;}// 交换找到的最小元素和第一个元素if (min != i) {int temp = arr[min];arr[min] = arr[i];arr[i] = temp;}}
}int main()
{int arr[] = { 64, 25, 12, 22, 11 };int n = sizeof(arr) / sizeof(arr[0]);selectionSort(arr, n);printf("排序后的数组: \n");for (int i = 0; i < n; i++)printf("%d ", arr[i]);printf("\n");return 0;
}

三·插入排序 

算法原理

插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

 完整代码

#include <stdio.h>void insertionSort(int arr[], int n) {for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;// 将比 key 大的元素向后移动while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}
}int main() {int arr[] = {12, 11, 13, 5, 6};int n = sizeof(arr) / sizeof(arr[0]);insertionSort(arr, n);printf("排序后的数组: \n");for (int i = 0; i < n; i++)printf("%d ", arr[i]);printf("\n");return 0;
}

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

相关文章:

  • web常见的攻击方式(下)
  • nvm和node的环境配置与下载
  • Windows Telnet 正在连接xxx...无法打开到主机的连接。 在端口 xxx: 连接失败
  • 电脑主板VGA长亮白灯
  • 2025-05-27 学习记录--Python-模块
  • NGINX HTTP/3 实验指南安装、配置与调优
  • PromQL 从基础入门教程
  • LVS负载均衡
  • 【免费】【无需登录/关注】卫星影像在线下载网页
  • 实战分享:DolphinScheduler 中 Shell 任务环境变量最佳配置方式
  • K8s边缘集群赋能工业自动化:从传感器监控到智能决策的全流程升级
  • Pic手机拼图软件:创意拼图,轻松上手
  • React JSX语法介绍(JS XML)(一种JS语法扩展,允许在JS代码中编写类似HTML的标记语言)Babel编译
  • ​扣子Coze飞书多维表插件-查询数据
  • 【无标题】使用JEasyOpc开发OPCDA采集中间件
  • Lua中的`self`参数:揭秘隐藏的“对象上下文”
  • 1992-2021年各省工业增加值数据(无缺失)
  • Linux的五种IO模型
  • Rust语言学习教程、案例与项目实战指引
  • c/c++的opencv双边滤波
  • 八大员-质量员考试复习资料有哪些?
  • 【Marp】自定义主题 - box01
  • Kotlin 实战:Android 设备语言与国家地区的 5 种获取方式
  • Playwright 常用命令、参数详解及使用示例
  • 精益数据分析(88/126):从营收平衡到规模化扩张——企业增长的最后一道关卡
  • 如何保护网络免受零日漏洞攻击?
  • php 实现基数排序
  • 编程规范Summary
  • ASP.NET Web Forms框架识别
  • 【论文精读】2024 arXiv --VEnhancer现实世界视频超分辨率(RealWorld VSR)