今天学长讲高效算法设计这一章,收益良多,特在此写一篇总结,加深记忆~
归并排序:
A[l-r]
A[l-mid],A[mid+1,r](两个序列分别按从大到小排列)
p=l; q=mid+1;
while(p<=mid&&q<=r)
{
if(A[p]<A[q])
B[t++]=A[q++];
else
B[t++]=A[p++];
if(p==mid) (把剩下的q-r直接赋值到B);
if(q==r) (把剩下的p-mid直接赋值到B);
}
最后得到的序列整体上就从大到小排列的啦
快排的程序:
int qqsort(int shu[],int left,int right)
{
int i=left,j=right,middle,key;
middle=shu[(left+right)/2];
do
{
while(i<right&&shu[i]<middle)i++;
while(j>left&&shu[j]>middle)j--;
if(i<=j){key=shu[i];shu[i]=shu[j];shu[j]=key;i++;j--;}
}while(i<=j);
if(left<j) qqsort(shu,left,j);
if(i<right) qqsort(shu,i,right);
return 0;
}
用二分和递归实现了快速排列,不得不感叹程序的奥秘无穷啊~
二分查找
给出一个长度为n的序列A1,A2,……,An,求最大连续和。
int maxsum(int *a,int x,int y)
{
int i,m,v,L,R,max;
if(y-x==1) return a[x];
m=x+(y-x)/2;
max=max(maxsum(a,x,m),maxsum(a,m,y));//递归调用分别求出两边最大和,再求其最大值。
v=0;L=a[m-1];
for(i=m-1;i>=x;i--)
L>?=(v+=a[i]);
v=0;R=a[m];
for(i=m;i<y;i++) R>?=(v+=a[i]);//写的是包括中间的最大连续和
return max>?(L+R);
}
当然还可以用lower_bound()函数和upper_bound()函数。