1.找数组中的最大值
顺序查找:复杂度o(n)
其中调用前res的初值应为负无穷
int find_max2(int a[],int l,int n,int res)//复杂度o(n)
{
if(l==n) return res;
int MAX1=find_max2(a,l+1,n,res);
res=max(MAX1,a[l]);
return res;
}
二分法:复杂度o(log n)
int find_max(int a[],int l,int r)//复杂度o(log n)
{
int mid;
//printf("[%d,%d]\n",l,r);
if(l==r) return a[l];
mid=(l+r)>>1;
int MAX1=find_max(a,l,mid);
int MAX2=find_max(a,mid+1,r);
return max(MAX1,MAX2);
}
2.打印图形
数塔1:空位在右边
void Print(int n)//数字塔
{
if(n==0) return ;
Print(n-1);
for(int i=0;i<n;i++) cout<<n<<" ";
cout<<endl;
}
数塔二:空位在左边
void Printone(int n,int m)//数塔2
{
if(n==0) return ;
Printone(n-1,m);
for(int i=m;i>0;i--)
if(i>n) printf("%-3c",' ');
else printf("%-3d",n);
printf("\n");
}
3.从左到右中点优先输出
分治的思想
void listorder(int a[],int l,int r)//从左到右中点优先输出
{
int mid;
if(l>r) return ;
mid=(l+r)>>1;
printf("%-4d",a[mid]);
listorder(a,l,mid-1);
listorder(a,mid+1,r);
}
4.字符串倒序输出
void Printstring(string a,int l,int n)//字符串倒序输出
{
if(l==n) return;
Printstring(a,l+1,n);
printf("%c",a[l]);
}
5.将整数转化为字符串输出
void convert(int n)//将整数转化为字符串输出
{
if(n==0) return ;
convert(n/10);
printf("%c",n%10+'0');
}
6.最大公约数
int gcd(int n,int m,int res)//求最大公约数
{
if(m==0) return n;
return gcd(m,n%m,res);
}
7.二分查找
int binsearch(int a[],int l,int r,int x)//二分查找
{
int mid;
if(l>r) return -1;
mid=(l+r)>>1;
printf("[%d,%d]\n",l,r);
if(x<a[mid]) binsearch(a,l,mid-1,x);
else if(x>a[mid]) binsearch(a,mid+1,r,x);
else return mid;
}
8.交换法枚举全排列
void fullarray(int a[],int l,int r)//交换法枚举全排列
{
int temp;
if(l==r)
{
for(int i=0;i<r;i++) cout<<a[i]<<' ';
cout<<endl;
cnt++;
return ;
}
for(int i=l;i<r;i++)
{
temp=a[i],a[i]=a[l],a[l]=temp;//交换
fullarray(a,l+1,r);
temp=a[i],a[i]=a[l],a[l]=temp;//复原,进行回朔
}
}
9.深搜枚举全排列
void dfs(int a[],int d,int n)//搜索枚举全排列
{
if(d==n)
{
for(int i=0;i<n;i++) cout<<ans[i]<<' ';
cout<<endl;
cn++;
return ;
}
for(int i=0;i<n;i++)
{
if(vis[i]) continue;
ans[cnt++]=a[i];
vis[i]=1;
dfs(a,d+1,n);
vis[i]=0;
cnt--;
}
}
10.计算n阶多项式的和
非递归:
int cal(int a[],int n,int x)
{
int sum = 0;
for(int i=0;i<=n;i++) sum+=a[i]*pow(x,i);
return sum;
}
递归:
int cal2(int a[],int n,int x,int sum)//计算n阶多项式的和
{
if(n==0) return sum+a[0];
sum=cal2(a,n-1,x,sum);
sum+=a[n]*pow(x,n);
return sum;
}
11.查询带头节点链表最大值的地址
其中 typedef node* linklist;
linklist max(linklist head)//返回带头结点链表中最大值的地址
{
if(head->next==NULL) return NULL;
if(head->next->next==NULL) return head->next;//若只剩一个元素。直接返回
linklist temp = max(head->next);
if(temp->info > head->next->info) return temp;
return head->next;
}