news 2026/7/11 11:53:47

嵌入式C语言阶段复习——排序方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式C语言阶段复习——排序方法

一、冒泡排序

冒泡排序通过重复比较相邻元素并交换位置完成排序。每一轮将最大(或最小)元素“冒泡”到数组

末尾。

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

时间复杂度:平均和最坏情况为 O(n^2),最好情况(已排序)为 O(n)。

二、选择排序

选择排序每次遍历未排序部分,找到最小(或最大)元素,与未排序部分的起始位置交换。

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

时间复杂度:始终为 O(n^2)

三、插入排序

插入排序将数组分为已排序和未排序两部分,逐个将未排序元素插入到已排序部分的正确位置。

void insertionSort(int arr[], int n) { for (int i = 1; i < n; 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; } }

时间复杂度:平均和最坏为 O(n^2),最好情况(已排序)为 O(n)

四、快速排序

快速排序采用分治策略,选择一个基准值(pivot),将数组分为小于基准和大于基准的两部分,递

归排序子数组。
实现代码:

int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp; return i + 1; } void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } }

时间复杂度:平均为 O(n *log n),最坏(已排序或逆序)为 O(n^2)

五、归并排序

归并排序通过递归将数组分为两半,分别排序后合并。

void merge(int arr[], int l, int m, int r) { int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (int i = 0; i < n1; i++) L[i] = arr[l + i]; for (int j = 0; j < n2; j++) R[j] = arr[m + 1 + j]; int i = 0, j = 0, k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) arr[k++] = L[i++]; else arr[k++] = R[j++]; } while (i < n1) arr[k++] = L[i++]; while (j < n2) arr[k++] = R[j++]; } void mergeSort(int arr[], int l, int r) { if (l < r) { int m = l + (r - l) / 2; mergeSort(arr, l, m); mergeSort(arr, m + 1, r); merge(arr, l, m, r); } }

时间复杂度:始终为 O(n *log n),但需要额外空间 O(n)。

六、堆排序

堆排序利用堆数据结构(完全二叉树),通过构建最大堆并交换堆顶元素实现排序。

void heapify(int arr[], int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[largest]) largest = left; if (right < n && arr[right] > arr[largest]) largest = right; if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } void heapSort(int arr[], int n) { for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); for (int i = n - 1; i > 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; heapify(arr, i, 0); } }

时间复杂度:始终为 O(n *log n)

七、总结

简单排序:冒泡、选择、插入排序适合小规模数据。

高效排序:快速、归并、堆排序适合大规模数据,快速排序通常最快。

稳定性:插入、归并排序是稳定的(相等元素顺序不变)。

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

中小企业必看!5款低代码工具帮你快速搭上业务系统

概述这段时间在帮公司和朋友找低代码平台&#xff0c;陆续试了好几款&#xff0c;发现现在免费低代码工具真的已经很好用了&#xff0c;不懂代码也能自己搭系统、做表单、建流程&#xff0c;效率提升特别明显。整理了一份我亲测觉得不错的平台清单&#xff0c;适合新手、团队、…

作者头像 李华
网站建设 2026/7/10 14:21:02

PGVector 详解:PostgreSQL 世界里的向量能力插件

PGVector 详解&#xff1a;PostgreSQL 世界里的向量能力插件一篇从原理、能力边界到工程实践的 PGVector 全面解析一、PGVector 是什么 PGVector 是 PostgreSQL 的一个扩展&#xff08;Extension&#xff09;&#xff0c;用于在 PostgreSQL 中引入 向量&#xff08;Vector&…

作者头像 李华
网站建设 2026/7/2 13:14:11

Java集合接口深度剖析:List、Map、Set的特点及应用

文章目录 Java集合接口深度剖析&#xff1a;List、Map、Set的特点及应用一、引言&#xff1a;为什么要学习集合框架&#xff1f;二、List接口&#xff1a;有序的“购物车”1. List的特点2. 常用实现类&#xff08;1&#xff09;ArrayList&#xff08;2&#xff09;LinkedList&a…

作者头像 李华
网站建设 2026/7/1 15:42:56

React 项目的启动方式

一、启动前先确认 3 件事&#xff08;很重要&#xff09; 在项目根目录&#xff08;有 package.json 的地方&#xff09;&#xff1a; 1. 确认 Node 版本 node -v npm -v一般建议 Node ≥ 18&#xff08;Vite / 现代 React 很稳&#xff09; 如果报错&#xff0c;大概率是…

作者头像 李华