640 字
3 分钟
一些算法知识点
2026-06-21

常见算法#

快速排序#

实现原理: 采用分治法,设置基准元素,并将原有数组划分为两个部分,一部分为小于基准元素的值,另一部分为大于基准元素的值,通过此操作将基准元素归位,随后对两个子数组递归进行相同操作,直至数组有序。

特点: 不稳定 的,平均时间复杂度O(nlogn)`O(n logn)`,最坏时间复杂度O(n2)`O(n^2)`,空间复杂度O(logn)`O(logn)`

/*
对数组进行划分操作
*/
int partition(std::vector<int>& arr, int left, int right){
int i = left, j = right; // 左右两侧循环进行扫描
while(i < j){ // 条件判断
/*
此处设置左侧第一个元素为基准元素
*/
// 先判断右指针,再判断左指针
while(i < j && arr[left] <= arr[j])
j--;
while(i < j && arr[i] <= arr[left])
i++; // 逐渐缩减范围
/*
当左右两侧指针越界或者找到位置不合适的元素时,进行元素的交换
*/
swap(arr[i], arr[j]);
}
swap(arr[i], arr[low]) // 将原来的基准元素放置到合适位置
return i; // 返回更新后的两个数组的界限下标
}
/*
递归操作
*/
void quick_sort(vector<int>& arr, int left, int right){
if(left >= right) return; // 触底反弹
int privot = partition(arr, left, right); // 获取分割后的基准值
quick_sort(arr, left, privot - 1); // 对左数组进行分割
quick_sort(arr, privot + 1, right); // 对右数组进行分割
}

深度优先搜索#

实现原理: 是一种基于递归的图遍历算法,通过邻接表获取节点的相邻信息,并标记已经访问的节点,确保每个节点都被遍历。
时间复杂度: O(V+E)O(V+E),只需要遍历每个节点和每条边一次便可。

void dfs(int u, vector<vector<int>>& adj, vector<bool>& visited){
visited[u] = true;
for(int v: adj<u>)
if(!visited[v]) dfs(v, adj, visited);
}

广度优先搜索#

实现原理: 利用队列的FIFO特性,确保元素的逐个访问,并标记已经访问的元素,循环遍历,直至所有元素都被标记。
时间复杂度: O(V+E)O(V+E);
空间复杂度: O(V)O(V);

void bfs(int start, vector<vector<int>>& adj, int numNodes){
queue<int> q;
vector<bool> visited(numNodes, false);
q.push(start);
visited[start] = true;
while(!q.empty()){
int u = q.front;
q.pop();
for(int v: adj[u]){
if(!visited[v]){
visited[v] = true;
q.push(v);
}
}
}
}

霍夫曼树#

构造过程: 每次从待选取队列中选取两个值最小的元素,遵循左小右大原则,进行组合生成新的元素,并添加到原有队列中,循环此步骤,直至构成一棵树。

一些算法知识点
https://kuchikirei.github.io/posts/algorithm1/
作者
LINKONG
发布于
2026-06-21
许可协议
CC BY-NC-SA 4.0