【笔记】可可布丁厨的基础算法笔记

目录

排序

查找

高精度

前缀和与差分

双指针算法

位运算

离散化


排序

1.归并排序

假设有数组a[2]={3,1,2,4}

第一步,将数组a分为左右两部分3,1和2,4

第二步,以分治思想再将3,1分为3和1

3与1比较,将小的数先存入数组t

得到t[2]={1,3}

再将t数组中的值返回到a数组

2,4同理

得到a[4]={1,3,2,4}

再递归回到第一步,得到1,3和2,4两部分分别有序的数组

1,3

2,4

1与2比较,将较小的1放入t数组

再3与2比较,将较小的2放入t数组

再3与4比较,将较小的3放入t数组

由于前半部分遍历完毕,将后半部分剩下的数全部按顺序放到t数组

最后将将t数组中的值返回到a数组

得到a[4]={1,2,3,4}

void merge_sort(int q[], int l, int r)
{
	int t[N];
    int x,i,j,k;
	if(l>=r)
	return;
	x=(l+r)/2;
	merge_sort(q,l,x),merge_sort(q,x+1,r);
	k=0;
	i=l;
	j=x+1;
	while(i<=x&&j<=r)
	{
		if(q[i]<=q[j])
		{
			t[k]=q[i];
			i++;
			k++;
		}
		else
		{
			t[k]=q[j];
			j++;
			k++;
		}
	}
	while(i<=x)
	{
		t[k]=q[i];
		i++;
		k++;
	}
	while(j<=r)
	{
		t[k]=q[j];
		j++;
		k++;
	}
	for(i=l,j=0;i<=r;i++,j++)
	{
		q[i]=t[j];
	}
}

2.快速排序

void quick_sort(int q[], int l, int r)
{
    int t;
    if (l >= r) return;
    int i = l - 1, j = r + 1, x = q[l];
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j)
        {
            t=q[i];
            q[i]=q[j];
            q[j]=t;
        }
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

查找

1.整数二分

 一般记住这个就好

2.浮点数二分

高精度

思想是将大数用字符串存储,然后逐位计算

需要注意的是存储数字时从最低位开始存,最后输出时再反转

1.高精度加法

void sum(char a[],char b[],char c[])
{
	int i=0,len1,len2,t;
	strrev(a);
	strrev(b);
	len1=strlen(a);
	len2=strlen(b);
	t=0;
	while(i<len1||i<len2)
	{
		if(i<len1&&i<len2)
		t=a[i]-'0'+b[i]-'0'+t;
		else if(i<len1)
		t=a[i]-'0'+t;
		else if(i<len2)
		t=b[i]-'0'+t;
		c[i]=t%10+'0';
		t=t/10;
		i++;
	}
	if(t!=0)
	c[i]=t+'0';
	strrev(c);
}

2.高精度减法

void jian(char a[],char b[],char c[])
{
	int len1,len2,t=0;
	int i=0;
	strrev(a);
	strrev(b);
	len1=strlen(a);
	len2=strlen(b);
	while(i<len1)
	{
		t=a[i]-'0'-t;
		if(i<len2)
		t-=b[i]-'0';
		c[i]=(t+10)%10+'0';
		if(t<0)
		t=1;
		else
		t=0;
		i++;
	}
	i=len1-1;
	while(c[i]=='0'&&i!=0)//去前导0
	{
		c[i]='\0';
		i--;
	}
	strrev(c);
	puts(c);
}
//比较函数,先让大数减去小数,最后再讨论是否需要加负号
int cmp(char a[],char b[])
{
	int i;
	if(strlen(a)>strlen(b))
	return 1;
	else if(strlen(a)<strlen(b))
	return 0;
	else
	{
		i=0;
		while(a[i]==b[i]&&i<=strlen(a))
		{
			i++;
		}
		if(i>strlen(a)||a[i]>=b[i])
		return 1;
		else
		return 0;
	}

3.高精度乘法(高精度乘非高精度)

4.高精度除法

前缀和与差分

1.一维前缀和

//a数组存储数字,s数组存储前缀和,代表下标a数组下标从1到i的和
S[i] = a[1] + a[2] + ... a[i]
//求[l,r]范围内a数组的和
a[l] + ... + a[r] = S[r] - S[l - 1]

2.一维差分

3.二维前缀和

//S[i][j]是第i行j列格子左上部分所有元素的和

//以x1行y1列为左上角,x2行y2列为右下角的子矩阵的和为
sum=S[x2][y2]-S[x1-1][y2]-S[x2][y1-1]+S[x1-1][y1-1];

4.二维差分

双指针算法

位运算

离散化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值