基础算法--常用模板
1. 快速排序模板
void quick_sort(int q[],int l,int r){
if(l>=r) return;
int i=l-1,j=r+1, x=q[l+r>>1]; //每次取中间数为主元
while(i<j){
//调整主元两边序列分别小于和大于
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);
}
主元每次选取数组 [ l , r ] [l,r] [l,r]中间数,然后将主元两边调整为小于和大于,这样一个循环不变关系,然后二分递归下去,时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)。
值得注意的是:当给定的序列有序时,如果每次选择区间左端点进行划分,每次会将区间 [ L , R ] [L, R] [L,R]划分成 [ L , L ] [L, L] [L,L]和 [ L + 1 , R ] [L + 1, R] [L+1,R],那么相当于每次递归右半部分的区间长度只会减少1,所以就需要递归 n − 1 n-1 n−1次了,时间复杂度会达到 O ( n 2 ) O(n^2) O(n2)。但每次选择区间中点或者随机值时,划分的两个子区间长度会比较均匀,那么期望只会递归 l o g n logn logn层。
2. 归并排序模板
void merge_sort(int q[], int l, int r)
{
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
//合并过程
int k = 0, i = l, j