基础算法--常用模板

这篇博客详细介绍了基础算法的模板,包括快速排序、归并排序、整数和浮点二分,以及高精度运算如加减乘除。还讨论了一维和二维前缀和、差分操作、位运算和双指针算法等,对于离散化和区间合并也进行了讲解。内容全面,适合算法学习者参考。
摘要由CSDN通过智能技术生成

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 n1次了,时间复杂度会达到 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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值