基础算法

插入排序:

void InsertSort(int a[], int len)

{
int j;
for (int i = 2; i <= len; i++)
{
a[0] = a[i];
for (j = i - 1; a[0] < a[j]; j--)
a[j + 1] = a[j];
a[j + 1] = a[0];
}
for (int x = 1; x <= len;x++)
cout << a[x]<<" ";

}

归并排序:

/*

 *  递归方法实现归并排序

 *  Lzy     2011-5-25

 */

#include <stdio.h>

#define N 8

 

//归并排序 递归实现

void merge(int X[], int low, int mid, int high) /*两个有序表的合并算法*/

{                                               //R[low..mid]和R[mid+1..high]是两个有序表

    int R1[N];                                  //临时缓冲区

    int i = low, j = mid+1, k = low;            //k是Rl的下标,i、j分别为R[low..m]和R[m+1..high]的下标

 

    for(; i <= mid && j <= high; k++)           /*依次比较两个了序列中数据元素的大小*/

    {

        if(X[i] <= X[j])                        /*将较小的数移入缓冲区*/

            R1[k] = X[i++];                     //将R[low..m]中的记录放入R1中

        else

            R1[k] = X[j++];                     //将R[m+1..high]中的记录放入R1中

    }

   

    while(<= mid)                             //将R[low..m]余下部分复制到R1

        R1[k++] = X[i++];  

    while(<= high)                            //将R[m+1..high]余下部分复制到R1

        R1[k++] = X[j++];

 

    for(= low; k <= high; k++)                /*将缓冲区中的数据元素复制回原序列中*/

        X[k] = R1[k];

}

 

void Merge_Sort(int X[], int low, int high)     /* 定义归并排序函数,递归方式 */

{

    int mid;

    if(low < high)

    {

        mid = (low + high) / 2;

        Merge_Sort(X, low, mid);                /* 递归调用,将子序列x[low~mid]归并为有序序列 */

        Merge_Sort(X, mid + 1, high);           /* 递归调用,将子序列x[mid+1~high]归并为有序序列 */

        merge(X,low,mid,high);                  /* 将子序列x[low~mid]和x[mid+1~high]进行归并 */

    }

}

 

/******测试程序*******/

int main(void)

{

    int i;

    int X[N] = {26,23,96,13,36,67,45,15};

    Merge_Sort(X,0,7);

   

    for(= 0; i < 8; i++)

        printf("%d ",X[i]);

 

}


快速排序:

#include <iostream>
 
using  namespace  std;
 
void  Qsort( int  a[],  int  low,  int  high)
{
     if (low >= high)
     {
         return ;
     }
     int  first = low;
     int  last = high;
     int  key = a[first]; /*用字表的第一个记录作为枢轴*/
 
     while (first < last)
     {
         while (first < last && a[last] >= key)
         {
             --last;
         }
 
         a[first] = a[last]; /*将比第一个小的移到低端*/
 
         while (first < last && a[first] <= key)
         {
             ++first;
         }
         
         a[last] = a[first];    
/*将比第一个大的移到高端*/
     }
     a[first] = key; /*枢轴记录到位*/
     Qsort(a, low, first-1);
     Qsort(a, first+1, high);
}
int  main()
{
     int  a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
 
     Qsort(a, 0,  sizeof (a) /  sizeof (a[0]) - 1); /*这里原文第三个参数要减1否则内存泄露*/
 
     for ( int  i = 0; i <  sizeof (a) /  sizeof (a[0]); i++)
     {
         cout << a[i] <<  "" ;
     }
     
     return  0;
} /*参考数据结构p274(清华大学出版社,严蔚敏)*/

PRIM算法:

// dna.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;


int N, cost[1001][1001], lowcost[1001], closest[1001];
int prim(int v0)
{
int i, j, mindis, minone;
int ans = 0;/*用来记录最小生成树的总长度*/
/*各点距离初始化*/
for (i = 1; i <= N; i++)
{
lowcost[i] = cost[v0][i];
closest[i] = v0;
}
for (i = 1; i < N; i++)
{
mindis = -1;
for (j = 1; j <= N; j++)
if (lowcost[j] && (mindis > lowcost[j] || mindis<0))
{
mindis = lowcost[j];
minone = j;
}
/*将找到的最近点加入最小生成树*/
ans += lowcost[minone];
lowcost[minone] = 0;
/*修正其他点到最小生成树的距离*/
for (j = 1; j <= N; j++)
if (cost[j][minone] < lowcost[j])
{
lowcost[j] = cost[j][minone];
closest[j] = minone;
}
}
return ans;
}


int main(){
cin >> N;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
cin >> cost[i][j];


cout << prim(1) << endl;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值