各种算法模板

public static void quick_sort(int[] q,int l,int r){//快速排序模板,l为数组最左边,一般为0,r为数组最右端,一般为q.length-1
//思想是,第一步先选取一个值x作为分界点,可以是q[l],q[r],q[l+r>>1],数组中随机一个值;然后第二步,选取左右指针,分别往中间走,当左指针遇到大于等于x时,停下,右指针遇到小于等于x时,停下,交换左右指针对应的值,一直循环,直到左指针大于等于右指针;第三步:递归排序
        if(l>=r) return;
        int x=q[l],i=l-1,j=r+1;
        while(i<j){
            do i++; while(q[i]<x);
            do j--; while(q[j]>x);
            if(i<j){
                int tmp=q[i];
                q[i]=q[j];
                q[j]=tmp;
            }
        }
        quick_sort(q,l,j);
        quick_sort(q,j+1,r);
    }
int quick_sort(int l,int r,int k){//快速选择算法,时间复杂度O(n),用于选取数组q中第k小的数,思想是在快排过程中,
//判断k是否大于等于左半边数组的大小sl;如果不是,则第k小的数在右半数组,于是只递归右半数组,所以时间复杂度会比快排低
    if(l==r) return q[l];
    int x=q[l],i=l-1,j=r+1;
    while(i<j){
        while(q[++i]<x);
        while(q[--j]>x);
        if(i<j) swap(q[i],q[j]);
    }
    int sl=j-l+1;
    if(k<=sl) return quick_sort(l,j,k);
    return quick_sort(j+1,r,k-sl);
}
void merge_sort(int q[],int l,int r){
//归并排序模板,主要思想是:第一步,先确定数组中点为分界点,第二步先递归,将数组不断分成一半,直到每个子数组只剩一个数;第三步,
//合并,两个相邻子数组分别有两个指向第一个数的指针i,j,小的数先装入临时空间tmp,然后指针向后移动一位,再循环比较,直到一方达到末
//尾,再加上另一方剩下的以有序的数字,最后将临时空间的值写回原数组
    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=mid+1;
    while(i<=mid&&j<=r){
        if(q[i]<=q[j]) tmp[k++]=q[i++];
        else tmp[k++]=q[j++];
    }
    while(i<=mid) tmp[k++]=q[i++];
    while(j<=r) tmp[k++]=q[j++];
    for(int i=l,j=0;i<=r;i++,j++){
        q[i]=tmp[j];
    }
}

long long merge_sort(int q[],int l,int r){
//寻找数组中逆序对的数量,思想是:不断递归到最下层,当合并时,若第i处的数字大于j处的,则i后面的也都大于j,所以个数+mid-i+1,
//然后不断递归返回,个数不断增加,直到完全归并。(其实红区的数量和绿区的数量是黄区归并完成后变的)
    if(l==r) return 0;
    int mid = l + r>>1;
    long long res=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]) tmp[k++] = q[i++];
        else{
            tmp[k++]=q[j++];
            res+=mid-i+1;
        }
    }
    while(i<=mid) tmp[k++]=q[i++];
    while(j<=r) tmp[k++]=q[j++];
    for(int i=l,j=0;i<=r;i++,j++){
        q[i]=tmp[j];
    }
    return res;
}

在这里插入图片描述

		//红色区的情况
	int bsearch_1(int l,int r){
		while(l<r){
            int mid=l+r+1>>1;
            if(check(mid)) l=mid;
            else r=mid-1;
        }
    }
    int bsearch_2(int l,int r){
		//绿色区的情况
		while(l<r){
            int mid=l+r>>1;
            if(check(mid)) r=mid;
            else l=mid+1;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>