一、排序算法
冒泡排序 (Bubble Sort)
原理:通过相邻元素两两比较交换,使最大元素逐渐"浮"到数组末尾。
时间复杂度:O(n²)
代码片段:
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])
swap(&arr[j], &arr[j+1]);
}
快速排序 (Quick Sort)
原理:分治思想,选取基准元素将数组分为左右两部分递归排序。
时间复杂度:平均O(n log n),最坏O(n²)
核心代码:
c
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) swap(&arr[++i], &arr[j]);
swap(&arr[i+1], &arr[high]);
return i+1;
}
二、查找算法
二分查找 (Binary Search)
前提:有序数组
时间复杂度:O(log n)
代码逻辑:
c
int binarySearch(int arr[], int l, int r, int target) {
while (l <= r) {
int mid = l + (r-l)/2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) l = mid+1;
else r = mid-1;
}
return -1;
}
三、数据结构相关算法
链表逆置 (Reverse Linked List)
核心思想:三指针法修改节点指向
c
struct Node* reverseList(struct Node* head) {
struct Node *prev = NULL, *curr = head, *next;
while (curr) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
二叉树遍历
深度优先 (DFS):递归实现前序/中序/后序遍历
广度优先 (BFS):使用队列层序遍历
四、动态规划 (Dynamic Programming)
斐波那契数列 (Fibonacci)
优化:避免递归重复计算,使用数组缓存结果
c
int fib(int n) {
int dp[n+1];
dp[0]=0; dp[1]=1;
for(int i=2; i<=n; i++)
dp[i] = dp[i-1] + dp[i-2];
return dp[n];
}
背包问题 (0-1 Knapsack)
核心方程:dp[i][w] = max(value[i]+dp[i-1][w-weight[i]], dp[i-1][w])
五、图算法
Dijkstra最短路径
适用场景:权重非负的有向图
核心:贪心策略 + 优先队列优化
Floyd-Warshall算法
特点:多源最短路径,通过三重循环动态更新距离矩阵
六、字符串处理
KMP模式匹配
优化:通过部分匹配表跳过无效比较
关键:计算最长前缀后缀公共长度(LPS数组)
七、数学算法
欧几里得算法 (GCD)
c
int gcd(int a, int b) {
return b==0 ? a : gcd(b, a%b);
}
素数筛法 (埃拉托斯特尼筛法)
用途:高效筛选指定范围内的素数
浙公网安备 33010602011771号