news 2026/5/3 17:35:11

C语言:排序(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言:排序(一)

目录

1. 前言

2. 冒泡排序

2.1 动态演示

2.2 代码实现

3. 插入排序

3.1 直接插入排序

3.1.1 动态演示

3.1.2 代码实现

3.2 希尔排序

3.2.1 代码实现

4. 选择排序

4.1 动态演示

4.2 代码实现

5. 堆排序

5.1 代码实现


1. 前言

本篇主要讲解基础的排序算法,教学意义较大,实践意义较小。

在排序代码中会频繁使用自定义函数Swap,因此在前言中进行声明,后文不再过多赘述。

void Swap(int* x, int* y) { int tmp = *x; *x = *y; *y = tmp; }

2. 冒泡排序

  • 时间复杂度O( N )
  • 思想:重复遍历数组,依次比较相邻的两个元素,如果左边比右边大,就交换它们的位置。每一轮遍历,都会把当前未排序部分中最大的那个元素“冒泡”到最右边。

2.1 动态演示

冒泡排序

2.2 代码实现

//冒泡排序 void BubbleSort(int* a, int n) { for(int i=0; i<n-1; i++) { for(int j=0; j<n-1-i; j++) { if(a[j] > a[j+1]) { Swap(&a[j], &a[j+1]); } } } }

3. 插入排序

3.1 直接插入排序

  • 时间复杂度O( N^2 ),最好情况O( N )
  • 思想:将数组分为“已排序”和“未排序”两部分,每次从未排序部分取出第一个元素,插入到已排序部分的正确位置。

3.1.1 动态演示

插入排序

3.1.2 代码实现

//插入排序 void InsertSort(int* a, int n) { for(int i=0; i<n-1; i++) //小于n-1是因为后面涉及end+1,如果小于n会越界 { int end = i; int obj = a[end + 1]; while(end >= 0) { if(a[end] > obj) { a[end + 1] = a[end]; //也可以用Swap end--; } else { break; } a[end + 1] = obj; } } }

3.2 希尔排序

  • 时间复杂度O( N^1.3 )左右
  • 思想:希尔排序是插入排序的改进版,通过“分组跳跃式插入”让数组先变得“大致有序”,最后再用一次插入排序完成精细调整。

3.2.1 代码实现

//希尔排序(预排序+插入排序,插入排序已被预排序包含) //法一:逐组进(三层循环) void ShellSort1(int* a, int n) { int gap = n; while(gap > 1) //gap为1时为插入排序 { gap = gap / 3 + 1; for(int j=0; j<gap; j++) //一共有gap数量的组 { for(int i=0; i<n-gap; i+=gap) //改为n-gap,否则会越界 { int end = i; while(end >= 0) { if(a[end] > a[end+gap]) { Swap(&a[end], &a[end+gap]); end-=gap; } else { break; } } } } } }
//法二:多组并行 void ShellSort2(int* a, int n) { int gap = n; while(gap > 1) { gap = gap / 3 + 1; for(int i=0; i<n-gap; i++) { int end = i; while(end >= 0) { if(a[end] > a[end + gap]) { Swap(&a[end], &a[end + gap]); end -= gap; } else { break; } } } } }

4. 选择排序

  • 时间复杂度O( N^2 )
  • 思想:每次从待排序部分选出最小(或最大)的元素,放到已排序部分的末尾。

4.1 动态演示

选择排序

// 这是最直接的选择排序,但在代码中采用了首尾双指针的方法进行选择排序:

同时找出区间内的最大和最小元素,放在区间首尾

4.2 代码实现

//选择排序(双指针) void SelectSort(int* a, int n) { int begin = 0; int end = n - 1; while(begin < end) { int mini = begin, maxi = begin; for(int i=begin+1; i<=end; i++) { if(a[i] > a[maxi]) { maxi = i; } if(a[i] < a[mini]) { mini = i; } } Swap(&a[maxi], &a[end]); //避免刻舟求剑TvT if(mini == end) mini = maxi; Swap(&a[mini], &a[begin]); begin++; end--; } }

5. 堆排序

  • 时间复杂度O( NlogN )
  • 思想:向上调整算法 + 模拟堆删除操作。顺序建大堆,倒序建小堆

详细介绍可以阅读博主之前写的这篇博客:

堆(C语言)-CSDN博客

5.1 代码实现

//堆排序(向下调整建大堆->每次交换首尾元素并end--,向下调整) void HeapSort(int* a, int n) { //向下调整 for(int i=(n-1-1)/2; i>=0; i--) { int parent = i; int child = parent * 2 + 1; while(child < n) { //假设法(右孩子存在且右孩子更大) if(child+1<n && a[child+1] > a[child]) { child += 1; } if(a[parent] < a[child]) { Swap(&a[parent], &a[child]); parent = child; child = parent * 2 + 1; } else { break; } } } //设置end,交换首尾元素 int end = n-1; while(end) { Swap(&a[end], &a[0]); //向下调整 int parent = 0; int child = parent * 2 + 1; while(child < end) { if(child+1<end && a[child+1] > a[child]) { child += 1; } if(a[parent] < a[child]) { Swap(&a[parent], &a[child]); parent = child; child = parent * 2 + 1; } else { break; } } end--; } }

//感谢阅读~(●'◡'●)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 2:56:57

Sability安卓(三)_基础开发知识扫盲,开学XML......

一、页面和布局 页面&#xff1a;一个APP通常由多个页面组成&#xff0c;如&#xff1a;登录页面、注册页面、首页、个人中心、商品详情页、购物车等等 在传统Android开发中&#xff0c;一个页面通常由两部分组成&#xff1a; 逻辑代码&#xff0c;即页面的逻辑功能&#xff0…

作者头像 李华
网站建设 2026/5/2 2:55:30

odoo 19会计模块功能详解:会计模块中默认科目的设置与使用方法

Odoo 19会计模块中默认科目的设置与使用方法 任何企业的高效财务管理&#xff0c;都依赖于一套组织完善的体系&#xff0c;来记录和监控收入、费用、资产、负债等各类财务活动。而实现这一目标的核心&#xff0c;就是通过会计科目对企业发生的每一笔交易进行分类核算。为了对这…

作者头像 李华
网站建设 2026/5/2 2:56:10

将联想手机备份到电脑的 4 种方法(简单快捷)

联想是一家著名的个人电脑制造商&#xff0c;收购摩托罗拉移动后&#xff0c;现已跻身Android智能手机主要供应商之列&#xff0c;仅次于三星、HTC、华为等知名手机厂商。联想手机凭借出色的摄像头、流畅的操作系统、完善的内置通讯信号以及精心设计的外观&#xff0c;俘获了全…

作者头像 李华
网站建设 2026/5/2 3:19:12

如何快速优化Windows系统:Win11Debloat终极清理工具完全指南

如何快速优化Windows系统&#xff1a;Win11Debloat终极清理工具完全指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter …

作者头像 李华
网站建设 2026/5/2 3:19:58

3步掌握艾尔登法环调试工具:从新手到模组开发者的实战指南

3步掌握艾尔登法环调试工具&#xff1a;从新手到模组开发者的实战指南 【免费下载链接】Elden-Ring-Debug-Tool Debug tool for Elden Ring modding 项目地址: https://gitcode.com/gh_mirrors/el/Elden-Ring-Debug-Tool 你是否曾想过在《艾尔登法环》中自由获取任何装备…

作者头像 李华