今天,算法篇要续更了。内容的话对于一些算法竞赛是适用的。内容涵盖:
- 基础算法:排序,二分,前缀和差分等等。
- 数据结构:栈,队列,堆,哈希等等。
- 图论与搜索:图的应用+DFS+BFS等等。
- 贪心算法:区间问题+huffman树等等。
- 动态规划:线性,区间等等。
- 数学类:快速幂,博弈论等等。(这个看时间)
理论补充完后,将补充习题,正文开始。
排序包含:快速排序和归并排序。
快速排序:
1.确定枢轴量x,以及双指针i,j。
2.交换元素,使得左区间元素小于等于x,右区间大于等于x。
3.递归左区间,递归右区间。
算法模板如下:
#include<iostream>
using namespace std;
int q[n]; //存放待排序元素
void quick_sort(int q[],int l,int r){
if(l>=r) return; //边界处理,递归终点
int x=q[l],i=l-1,j=r+1;
while(l<r){
do i++; while(q[i]<x);
do j--; while(q[j]>x);
if(i<j) swap(q[i],q[j]); //内置交换函数
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
上面的模板,可以解决所有的边界问题。因此,可以直接用,要是调整边界的话,注意修改的正确性。
归并排序
1.确定边界值mid=(l+r)/2;
2.归并排序左半边,归并排序右半边。
3.归并,将两个有序序列归并为一个序列。
模板:
#include<iostraem>
using namespace std;
int q[n],temp[n]; //q待排序数组;temp辅助数组,是必要的。
void merge_sort(int q[],int l,int r){
if(l>=r) return;
int mid=(l+r)/2;
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r){
if(q[i]<=q[j]) temp[k++]=q[i++];
else temp[k++]=q[j++];
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r) temp[k++]=q[j++];
for(int i=l,j=0;i<=r;i++,j++) q[i]=temp[j];
}