目录
排序
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.二维差分