分治法求最大连续和:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int dfs(int x,int y)
{
if(y-x==1)
return a[x];
int m=x+(y-x)/2;
int maxs=max(dfs(x,m),dfs(m,y));
int v=0;int l=a[m-1];
for(int i=m-1;i>=x;i--)
l=max(l,v+=a[i]);
v=0;
int r=a[m];
for(int i=m;i<y;i++)
r=max(r,v+=a[i]);
return max(maxs,l+r);
}
int main()
{
#ifdef LOCAL_DEBUG
freopen("text.in","r",stdin);
freopen("text.out","w",stdout);
#endif // LOCAL_DEBUG
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cout<<dfs(0,n)<<endl;
return 0;
}
二分法查找算法:
#include <iostream>
using namespace std;
const int N=1e6;
int a[N+5];
//在数组a(n个元素)中查找x,找到返回下标,找不到返回-1
int bi_search(int a[],int n,int x)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)/2; //取中间位置
if(x==a[mid]) //中间位置元素为要查找元素,返回下标
return mid;
if(x<a[mid]) //在左半区间继续查找
r=mid-1;
else if(x>a[mid]) //在右半区间继续查找
l=mid+1;
}
return -1;
}
//二分法非递归
int main()
{
int n;
for(int i=0;i<N;i++)
a[i]=i+1; //存储N个元素,存储的数字为下标加1
int x;
while(cin>>x)
{
int t=bi_search(a,N,x); //二分查找找到返回下标,没找到返回-1
if(t==-1)
cout<<"Not Found!"<<endl;
else
cout<<t<<endl;
}
return 0;
}
插入排序:
#include <iostream>
using namespace std;
//数组中的元素为a[0],a[1]...,a[n-1]
void insert_sort(int a[],int n)
{
//n-1次插入排序
for(int i=1;i<n;i++)
{
int t=a[i],j; //保存当前要插入排序的元素
//当前元素与前面有序数据从右到左依次比较
for(j=i-1;j>=0;j--)
{
if(t>=a[j]) //大于等于不移动
break;
a[j+1]=a[j]; //大的数向后移动
}
a[j+1]=t;
}
return;
}
//插入排序
int main()
{
int a[]={49,38,65,97,76,13,27,49}; //存储的数据
int n=sizeof(a)/sizeof(*a); //存储的数据个数
insert_sort(a,n);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
归并排序:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
//对数组a进行归并排序,下标范围为半开区间[0,n)
void MergeSort(int x,int y)
{
//递归终止条件,半开区间只有一个元素是右端点-左端点=1,这时一定有序
if(y-x==1)
return;
//一分为二,取中间位置,对2个子数组进行分开排序
int m=x+(y-x)/2;
MergeSort(x,m); //左半区间归并排序
MergeSort(m,y); //右半区间归并排序,中值在右半区间
//合并,依次取出子数组的元素进行合并
int *ta=new int[y-x]; //定义一个临时数组
int p=x,q=m,i=x; //p,q为两边数组的起始坐标
while(p<m || q<y) //两边任意一个数组没有全部复制完
{
if(q>=y || (p<m && a[p]<=a[q])) //从左半数组复制到临时空间
ta[i++]=a[p++];
else //从右半数组复制到临时空间
ta[i++]=a[q++];
}
for(int i=x;i<y;i++) //从辅助空间复制回数组
a[i]=ta[i];
}
int main()
{
#ifdef LOCAL_DEBUG
freopen("text.in","r",stdin);
freopen("text.out","w",stdout);
#endif // LOCAL_DEBUG
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
MergeSort(0,n);
return 0;
}