学习算法中
Posted zsl6658
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习算法中相关的知识,希望对你有一定的参考价值。
学习算法中
所有的算法实验代码全部贴上来,后续还有.
1,排列的生成算法:
//---------------------------------------------------------------------------
#include <iostream>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
void Swap(char& a,char& b)
{
char temp=a;
a=b;
b=temp;
}
void Perm(char a[],int k,int m)
{
if(k==m)
{
for(int i=0;i<m;i++)
cout<<a[i]<<" ";
cout<<endl;
}
else
{
for(int j=k;j<m;j++)
{
Swap(a[k],a[j]);
Perm(a,k+1,m);
Swap(a[k],a[j]);
}
}
}
int main(int argc, char* argv[])
{
char str[]={'a','b','c','d'};
Perm(str,0,4);
system("pause");
return 0;
}
//---------------------------------------------------------------------------
//将一个正整数划分成一系列正整数之和。
//q(n,m)表示正数n被划分成最大加数为m的划分数
//q(n,m)=q(n,m-1)+q(n-m,m)
//q(n,n)=q(n,n-1)+1
int q(int n,int m)
{
if((n<1)||(m<1))
return 0;
if((n==1)||(m==1))
return 1;
if(n<m)
return q(n,n);
if(n==m)
return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
//---------------------------------------------------------------------------
#include <iostream>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
//快速排序,首先划分,然后分治
//划分一个序列为两个,大小各分中轴两边。
int Partition(int a[],int p,int r)
{
int i=p;
int j=r;
int x=a[p];
while(i<j)
{
while((i<j)&&(a[j]>x))
j--;
a[i]=a[j];
while((i<j)&&a[i]<x)
i++;
a[j]=a[i];
}
a[i]=x;
return i;
}
void QuickSort(int a[],int p,int r)
{
if(p<r)
{
int q=Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int main(int argc, char* argv[])
{
int a[7]={3,7,1,6,4,5,2};
QuickSort(a,0,6);
int i=0;
while(i<7)
{
cout<<a[i];
i++;
}
cout<<endl;
system("pause");
return 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <iostream>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
//一维情形的最大子段和问题。
//最大子段和问题的三种解法时间复杂度分别为O(n^3),O(n^2),O(n)
int max1(int* a,int n,int& p,int &q)
{
int sum=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int thissum=0;
for(int k=i;k<j;k++)//没有充分利用以前计算的结果。
{
thissum+=a[k];
if(thissum>sum)
sum=thissum;
p=i;
q=j;
}
}
}
return sum;
}
int max2(int* a,int n,int& p,int& q)
{
int sum=0;
for(int i=0;i<n;i++)
{
int thissum=0;
for(int j=0;j<n;j++)
{
thissum+=a[j]; //充分利用以前计算的结果。
if(thissum>sum)
sum=thissum;
p=i;
q=j;
}
}
return sum;
}
int max3(int* a,int n,int& p,int& q)
{
int sum=0;
int thissum=0;
for(int i=0;i<n;i++)
{
if(thissum>0)
thissum+=a[i];
else
{
thissum=a[i];
p=i;
}
if(thissum>sum)
{
sum=thissum;
q=i;
}
}
return sum;
}
//二维情形的最大子矩阵问题。
int maxmatrix(int m,int n,int **a)
{
int e,f;
int sum=0;
int* b=new int[n];
for(int i=0;i<m;i++)
{
for(int k=0;k<n;k++)
b[k]=0;
for(int j=i;j<m;j++)
{
for(int k=0;k<n;k++)
b[k]+=a[j][k];
int max=max3(b,n,e,f);//最大行序列和。
if(max>sum)
sum=max;
}
}
return sum;
}
int main(int argc, char* argv[])
{
int **a=new int*[3];
int b1[3]={-2,3,6};
int b2[3]={-7,4,8};
int b3[3]={3,2,-9};
a[0]=b1;
a[1]=b2;
a[2]=b3;
int max=maxmatrix(3,3,a);
cout<<max<<endl;
system("pause");
return 0;
}
//---------------------------------------------------------------------------
以上是关于学习算法中的主要内容,如果未能解决你的问题,请参考以下文章