算法归类

1.累加法,累乘法

将一串数字累加或累乘

应用,求某一串数字的和或积,

下面代码为求1到n的阶乘的和(递归方式)

#include <stdio.h>
int jie(int n)
{
    if(n==1)
    return 1;
    return n*jie(n-1);
}
int sum(int i)
{
    if(i==1)
    return 1;
    return sum(i-1)+jie(i);

}
int main()
{
    int a,b;
    scanf("%d,%d",&a,&b);
    scanf("");
    printf("%d\n",jie(a));
    printf("%d\n",sum(b));
}

2.监哨值法

 

在多个元素中,从左往右遍历中通过哨兵去指向当前的最值。

  应用:求当前元素中的最值

下面为求最大值

#include<stdio.h>

void main()

{

    int i=0;

    int a=buf[0];

    int buf[10]={1,2,7,9,5,6};

    for(i=1;i<6;i++)

    {

        if(a<buf[i])

            a=buf[i];

    }

    printf("%d",a);

}

3.冒泡排序

将一组元素从前往后遍历根据大小关系进行交换

应用将一组元素按一定顺序排列(升序,降序)

下面为降序排列

#include<stdio.h>
void main()
{
    char buf[11]="abcdjdksla";
    int i,j,temp;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10-i-1;j++)
        {
            if(buf[j]<buf[j+1])
            {
                temp=buf[j];
                buf[j]=buf[j+1];
                buf[j+1]=temp;
            }
        }
    }
    printf("%s",buf);
}

4.插入排序

将数组分成排序和未排序两个部分

注:第一个元素相当于已排序好的

#include<stdio.h>
void main()
{
        int buf[6]={3,5,1,7,4,9};
        int i,j,temp;
        for(i=0;i<6-1;i++)
        {
                j=i;
                temp=buf[j];
                if(buf[j]<buf[j-1])
                {
                        while(j>0&&temp<buf[j-1])
                        {
                                buf[j]=buf[j-1];
                                j--;
                        }
                        buf[j]=temp;
                }
        }
        for(i=0;i<6;i++)
                printf("%d",buf[i]);
}

5.选择排序

再为排序的元素中找出最大/小值将这个值放到已排序的元素的最后面

注:当只剩一个元素未排序时,其实这个时候排序已完成。

#include<stdio.h>
void getmax(char buf[100])
{
        int listen=0;
        int i,j;
        char temp;
        for(i=0;buf[i]!='\0';i++)
        {
                listen=i;
                for(j=i+1;buf[j]!='\0';j++)
                {
                        if(buf[listen]<buf[j])
                        {
                                listen=j;
                        }
                }
                if(listen!=i)
                {
                        temp=buf[i];
                        buf[i]=buf[listen];
                        buf[listen]=temp;
                }
        }
                printf("%s",buf);
}

6.二分查找法

查找关键字符:二分(折半)查找法  (缩小区域)
     前题:查找序列是有序(降/升序)  
     假定:升序
      1、每次取序列中间元素进行比较
      2、如果key>mid,说明查找值在中间元素的右侧,
         如果key<mid,说明查找值在中间元素的左侧,
         key==mid,说明查找成功
      3、如果查找不成功,则再重复1,2步骤,直到查找成功或失败

#include<stdio.h>
struct student
{
        char name[10];
        int score;
        char miaoshu[20];
};
void cha(struct student buf[100],int key,int left,int right)
{
        int mid;
        mid=(left+right)/2;
        if(left>right)
        {
                printf("查找失败");
                return ;
        }
        if(key<buf[mid].score)
                return cha(buf,key,left,mid-1);
        else if(key>buf[mid].score)
                return cha(buf,key,mid+1,right);
        else if(key==buf[mid].score)
        {
                printf("查找成功\n");
                printf("%s%d%s\n",buf[mid].name,buf[mid].score,buf[mid].miaoshu);
                return ;
        }
}
void main()
{
        struct student buf[100]={{"zs",45,"张三"},{"ls",67,"李四"},\
                {"ww",68,"王五"},{"wmz",78,"王麻子"},{"bsj",100,"白少杰"}};
        cha(buf,67,0,4);
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值