今天,算法篇要续更了。内容的话对于一些算法竞赛是适用的。内容涵盖:
- 基础算法:排序,二分,前缀和差分等等。
 - 数据结构:栈,队列,堆,哈希等等。
 - 图论与搜索:图的应用+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];
}










