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

C语言--简单排序算法(冒泡、选择、插入)

实现三种简单的排序算法

文章目录

  • 冒泡排序
    • 改进
    • 改进2
  • 选择排序
  • 插入排序
  • 执行结果

冒泡排序

每次外层循环,排出一个最大值

void bubbleSort(int arr[], int len) {for (int i = 0; i < len - 1; i++) {for (int j = 0; j < len - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

改进

  1. 设置排序完成标志,如果排序完成跳出循环
  2. 通过设置边界,跳过无意义的片段
void bubbleSort2(int arr[], int len) {int border = len - 1;for (int i = 0; i < len; i++) {bool isSorted = true;int lastSwap = 0;for (int j = 0; j < border; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;isSorted = false;lastSwap = j;}}border = lastSwap;if (isSorted) {break;}}
}

改进2

双向冒泡排序,又称鸡尾酒排序

void bubbleSort3(int arr[], int len) {for (int i = 0; i < len / 2; i++) {//有序标记,每一轮的初始值都是truebool isSorted = true;//奇数轮,从左向右比较和交换for (int j = i; j < len - i - 1; j++) {if (arr[j] > arr[j + 1]) {int t1 = arr[j];arr[j] = arr[j + 1];arr[j + 1] = t1;isSorted = false;}}if (isSorted) {break;}//在偶数轮之前,将isSorted重新标记为trueisSorted = true;for (int j = len - i - 1; j > i; j--) {if (arr[j] < arr[j - 1]) {int t2 = arr[j];arr[j] = arr[j - 1];arr[j - 1] = t2;isSorted = false;}}if (isSorted) {break;}}
}

动态记录有效边界

void bubbleSort4(int arr[], int len) {int left = 0;int right = len - 1;int lastSwap = 0;while (left < right) {// 奇数轮lastSwap = left;for (int i = left; i < right; i++) {if (arr[i] > arr[i+1]) {int t1 = arr[i];arr[i] = arr[i+ 1];arr[i+ 1] = t1;lastSwap = i;}}// 收缩右边界right = lastSwap;// 偶数轮lastSwap = right;for (int i = right; i > left; i--) {if (arr[i] < arr[i - 1]) {int t2 = arr[i];arr[i] = arr[i - 1];arr[i - 1] = t2;lastSwap = i;}}// 收缩左边界left = lastSwap;}
}

选择排序

每次循环选出一个最小值,放在数组最前面

  void selectionSort(int arr[], int len) {for (int i = 0; i < len; i++) {int minIndex = i;for (int j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}
}

插入排序

每次将一个数加入到已经排好序的数列当中
第一个数是直接排好的

void insertionSort(int arr[], int len) {for (int i = 1; i < len; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
}

执行结果

int main() {//定义数组元素int array[] = {12, 3, 77, 34, 91, 23, 19, 1,45, 37};int len = sizeof(array) / sizeof(array[0]);insertionSort(array, len);//输出for (int i = 0; i < len; i++) {printf("%d ", array[i]);}printf("\n");return 0;
}

![在

http://www.lryc.cn/news/546530.html

相关文章:

  • 【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey
  • MySQL-高级查询
  • Netty笔记10:LengthFieldBasedFrameDecoder很简单,请看
  • linux 安装Mysql无法远程访问问题的排查
  • DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!
  • 英文生物信息学技术社区Top10推荐:基本情况、评介和网页链接
  • Lumerical INTERCONNECT 中的自相位调制 (SPM)
  • 每日定投40刀BTC(6)20250227 - 20250302
  • leetcode 230. 二叉搜索树中第 K 小的元素
  • 华为hcia——Datacom实验指南——配置手工模式以太网链路聚合
  • Metal学习笔记十一:贴图和材质
  • VirtualBox虚拟机MacOS从Big Sur升级到Sequoia(失败)
  • *算法中的数据结构(3)
  • 【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析
  • MyBatisPlus搭建教程
  • 【商城实战(2)】商城架构设计:从底层逻辑到技术实现
  • 数据序列化协议 Protobuf 3 介绍(Go 语言)
  • 从芯片到光网络:解密平面光波导技术(PLC)核心优势
  • 5分钟快速搭建一个 SpringBoot3 + MyBatis-Plus 工程项目
  • 如何判断https使用了哪个版本的TLS?
  • 如何在 NocoBase 中实现 CRM 的线索转化
  • StarRocks-fe工程在Cursor中不能识别为Java项目
  • 影刀RPA开发拓展--SQL常用语句全攻略
  • 05类加载机制篇(D6_方法调用和方法执行)
  • 视音频数据处理入门:颜色空间(二)---ffmpeg
  • 从零开始:H20服务器上DeepSeek R1 671B大模型部署与压力测试全攻略
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(5)
  • Leetcode 3469. Find Minimum Cost to Remove Array Elements
  • Excel的行高、列宽单位不统一?还是LaTeX靠谱
  • (新版本onenet)stm32+esp8266/01s mqtt连接onenet上报温湿度和远程控制(含小程序)