sort-template
658 字
3 分钟
sort-template
给我这些排序的特点、原理、cpp可实现代码,方便我学习以及亲自手敲代码
- 选择排序(多次”打擂台”)
- 冒泡排序
- 插入排序
- 计数排序
- 基数排序
- 快速排序
- 归并排序(分治)
- 堆排序
- 桶排序
- 希尔排序(并非常见)
- 锦标赛排序(并非常见)
- Tim排序(并非常见)
以下是各类排序算法的特点、原理及C++实现代码,按常用程度和逻辑复杂度排序,方便学习和手敲练习:
1. 选择排序(Selection Sort)
特点
- 原理简单,不稳定排序(如
[2,2,1]会交换第一个2和1,破坏稳定性)。 - 时间复杂度:O(n²),空间复杂度:O(1)。
- 适合小规模数据,交换次数少(最多n-1次)。
原理
每次从待排序区间选择最小(或最大)元素,放到区间起始位置,重复直到排序完成。
C++实现
#include <vector>using namespace std;
void selectionSort(vector<int>& arr) { int n = arr.size(); for (int i = 0; i < n - 1; ++i) { int minIdx = i; // 记录最小值索引 for (int j = i + 1; j < n; ++j) { if (arr[j] < arr[minIdx]) { minIdx = j; } } swap(arr[i], arr[minIdx]); // 交换到当前位置 }}2. 冒泡排序(Bubble Sort)
特点
- 原理直观,稳定排序(相等元素不交换)。
- 时间复杂度:O(n²),空间复杂度:O(1)。
- 适合几乎有序的数据(可优化提前终止)。
原理
重复遍历数组,每次比较相邻元素,顺序错误则交换,直到没有元素交换(排序完成)。
C++实现
#include <vector>using namespace std;
void bubbleSort(vector<int>& arr) { int n = arr.size(); bool swapped; // 优化:判断是否已有序 for (int i = 0; i < n - 1; ++i) { swapped = false; for (int j = 0; j < n - i - 1; ++j) { // 尾部已排序,无需再比较 if (arr[j] > arr[j + 1]) { swap(arr[j], arr[j + 1]); swapped = true; } } if (!swapped) break; // 无交换,提前终止 }}3. 插入排序(Insertion Sort)
特点
- 稳定排序,适合小规模或部分有序数据。
- 时间复杂度:O(n²),空间复杂度:O(1)。
- 实际应用中比冒泡排序高效(移动操作比交换少)。
原理
将数组分为「已排序」和「未排序」两部分,每次从后者取一个元素,插入前者的合适位置。
C++实现
#include <vector>using namespace std;
void insertionSort(vector<int>& arr) { int n = arr.size(); 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; }}(其余排序算法代码略,请参考完整文章)
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
sort-template
https://jiheweihuan.github.io/posts/sort-template/ 相关文章 智能推荐
1
C++STL之numeric库用法
笔记 C++ STL中numeric头文件提供的数值运算相关函数的用法总结。
2
C++与Python的tuple对比
笔记 Python中的Tuple与C++中的Tuple的基本用法、高级特性对比和实用示例。
3
iterator用法
笔记 迭代器的核心思想、用法以及C++与Python中的迭代器对比。
4
python和java中hashset和hashmap的区别
笔记 在 Java、Python 等语言中,HashMap(哈希映射)和 HashSet(哈希集合)的核心功能区别和语法特性对比。
5
attention的一些关系图
笔记 关于Attention机制中各种编码解码关系的Mermaid图表展示。
随机文章 随机推荐