欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法小记

程序员文章站 2022-07-12 13:48:20
...

简单算法日记

topic:最近突然对算法有了一定的兴趣,专门记录一下。

快速排序

#include<iostream>
#include<windows.h>
#include<time.h>
using namespace std;
void quickSort(int a[],int l,int r)
{
    if(l<r)
    {
        int i=l,j=r,x=a[l];
        while(i<j)
        {
            while(i<j&&a[j]>=x)
                j--;
            if(i<j)
                a[i++]=a[j];
            while(i<j&&a[i]<x)
                i++;
            if(i<j)
                a[j--]=a[i];
        }
        a[i]=x;
        quickSort(a,l,i-1);
        quickSort(a,i+1,r);
    }
}
int main()
{
    srand(time(NULL));
    int array[10];
    for(int i=0;i<10;i++)
    {
        array[i]=rand()%20;
    }
    quickSort(array,0,9);
    for(int i=0;i<10;i++)
    {
        cout<<array[i]<<" ";
    }
    cout<<endl;
    return 0;
}

简单选择排序

#include<iostream>
#include<windows.h>
#include<time.h>
using namespace std;
void SinpleChosenSort(int a[],int len)
{
    for(int i=0;i<len;i++)
    {
        int smallest=a[i];
        int smallpos=i;
        for(int j=i;j<len;j++)
        {
            if(a[j]<smallest)
            {
                smallest=a[j];
                smallpos=j;
            }
        }
        a[smallpos]=a[i];
        a[i]=smallest;
    }
}
int main()
{
    srand(time(NULL));
    int array[10];
    for(int i=0;i<10;i++)
    {
        array[i]=rand()%20;
    }
    SinpleChosenSort(array,10);
    for(int i=0;i<10;i++)
    {
        cout<<array[i]<<" ";
    }
    cout<<endl;
    return 0;
}

floyd

#include<iostream>
#include<windows.h>
#define MAXN 10
#define INF 1000
using namespace std;
typedef struct Graph_Struct
{
    int vexnum;
    int edgenum;
    int matrix[MAXN][MAXN];
}Graph;
int pMatrix[MAXN][MAXN];
int dMatrix[MAXN][MAXN];
void floyd(Graph G,int P[MAXN][MAXN],int D[MAXN][MAXN])
{
    for(int i=0;i<G.vexnum;i++)
    {
        for(int j=0;j<G.vexnum;j++)
        {
            P[i][j]=G.matrix[i][j];
            D[i][j]=j;
        }
    }
    for(int k=0;k<G.vexnum;k++)
    {
        for(int i=0;i<G.vexnum;i++)
        {
            for(int j=0;j<G.vexnum;j++)
            {
                if(P[i][j]>(P[i][k]+P[k][j]))
                {
                    P[i][j]=P[i][k]+P[k][j];
                    D[i][j]=k;
                }
            }
        }
    }
}

int main()
{
    int start,end;
    Graph G;
    cout<<"cin vexnum"<<endl;
    cin>>G.vexnum;
    for(int i=0;i<G.vexnum;i++)
    {
        for(int j=0;j<G.vexnum;j++)
        {
            G.matrix[i][j]=INF;
        }
    }
    cout<<"cin edgenum"<<endl;
    cin>>G.edgenum;
    for(int i=0;i<G.edgenum;i++)
    {
        int v,w;
        cout<<"No."<<i+1<<endl;
        cout<<"cin start"<<endl;
        cin>>v;
        cout<<"cin end"<<endl;
        cin>>w;
        v--;
        w--;
        cout<<"cin value"<<endl;
        cin>>G.matrix[v][w];
        G.matrix[w][v]=G.matrix[v][w];
    }
    floyd(G,pMatrix,dMatrix);
    cout<<"cin start"<<endl;
    cin>>start;
    cout<<"cin end"<<endl;
    cin>>end;
    start--;
    end--;
    cout<<pMatrix[start][end];
    cout<<start<<"-->";
    while(dMatrix[start][end]!=end)
    {
        cout<<dMatrix[start][end]<<"-->";
        start=dMatrix[start][end];
    }
    cout<<end;
    return 0;
}

Dijstra

#include<iostream>
#include<windows.h>
#include<cstdio>
#define MAXN 10
#define INF 1000
using namespace std;
int arcs[MAXN][MAXN];
int preNode[MAXN];
int Dis[MAXN];
int flags[MAXN];
void ShortestPath_DIJ(int Num,int v0)
{
    for(int i=0;i<Num;i++)
    {
        flags[i]=0;
        preNode[i]=0;
        Dis[i]=arcs[v0][i];
        if(Dis[i]<INF)
            preNode[i]=v0;
    }
    Dis[v0]=0;
    flags[v0]=1;
    for(int i=0;i<Num;i++)
    {
        int min=INF;
        int loc;
        for(int j=0;j<Num;j++)
        {
            if(flags[j]!=1&&Dis[j]<min)
            {
                loc=j;
                min=Dis[j];
            }
        }
        flags[loc]=1;
        for(int j=0;j<Num;j++)
        {
            if(flags[j]!=1&&(min+arcs[loc][j])<Dis[j])
            {
                Dis[j]=min+arcs[loc][j];
            }
        }
    }
    for(int i=0;i<Num;i++)
    {
        cout<<Dis[i]<<" ";
    }
}
int main()
{
    int NodeNum;
    cout<<"cin NodeNum"<<endl;
    cin>>NodeNum;
    for(int i=0;i<NodeNum;i++)
    {
        for(int j=0;j<NodeNum;j++)
        {
            arcs[i][j]=INF;
        }
    }
    int temp;
    cout<<"cin EdgeNum"<<endl;
    cin>>temp;
    for(int i=0;i<temp;i++)
    {
        cout<<"No."<<i+1<<endl;
        int j,k;
        cin>>j>>k;
        j--;
        k--;
        cin>>arcs[j][k];
    }
    int v0;
    cout<<"cin v0"<<endl;
    cin>>v0;
    ShortestPath_DIJ(NodeNum,v0);
    return 0;
}
  • 在看prim算法的时候,发现prim算法其实和dijstra算法十分的相似主要的区别体现在distance的更新上,dijstra中distance记录的是起点到各个节点的距离,prim算法中记录的则是已在树中的节点到其他节点的最短距离。

上一篇: 算法小记

下一篇: 算法小记