学习算法中

                                                 学习算法中

所有的算法实验代码全部贴上来,后续还有.

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;
}
//---------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值