算法小记

简单算法日记

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算法中记录的则是已在树中的节点到其他节点的最短距离。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值