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/
作者
几何为欢
发布于
2025-10-10
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
几何为欢
CUMT 2025级大一在读 人工智障专业 CTF/ACM入门ing 希望成为CS/AI人才喵!
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
13
分类
7
标签
19
总字数
6,280
运行时长
0
最后活动
0 天前

目录