快速排序
快速排序是一个很重要的算法,就算是背都要背下来的哦!!
刚刚自己试着写了一遍
直接上代码
#include<bits/stdc++.h>
using namespace std;
int a[1000];
void quicksort(int lefts,int rights)
{
int ji,z,y,d;
if(lefts>rights)return;
z=lefts;
y=rights;
ji=a[lefts];
while(z!=y)
{
while(z<y&&a[y]>=ji)
{
y--;
}
while(z<y&&a[z]<=ji)
{
z++;
}
if(z<y)
{
d=a[z];
a[z]=a[y];
a[y]=d;
}
}
a[lefts]=a[z];
a[z]=ji;
quicksort(lefts,z-1);
quicksort(z+1,rights);
return ;
}
int main()
{
int b,n;
while(scanf("%d",&n)!=EOF)
{
for(b=0;b<n;b++)
{
scanf("%d",&a[b]);
}
quicksort(0,n-1);
for(b=0;b<n;b++)
{
printf("%d ",a[b]);
}
}
}
求一串数字的最大子序列
我的第一个想法和大家一样肯定都是暴利法,双层循环,把每一个都算出来
在网上看到了一个更好的方法
思路:从右向左,依次加起来,每次加一个数都与保存的最大值比较,如果结果大于最大值就将值赋给最大值,如果加起来小于0,它必定无法使后面的值增大,所以另加的那个值大于零,这样一直到最后,当然,如果全部都是负数,取最大值。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10000],b,p,n,mx;
cin>>n;
b=p=mx=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]>0)b=1;//判断正负,只要有一个为正数即可
p+=a[i];
if(p>mx)mx=p;
if(p<0)p=0;
}
if(b){
cout<<mx<<endl;
}
else
{
sort(a,a+n);
cout<<a[n-1]<<endl;
}
}
写这个代码时候我突然想起过这个代码我去年的时候写过,那个时候还是我自己想出来的。看来 ,,不进则退啊!