算法入门(01)

有非常多的算法,比如递推法,穷举法,贪心算法,分治法,动态规划法,迭代法,分支界限法,回溯法.

仓库地址

Fundamentals of Algorithmics

1.数组倒置算法

数组中有非常多的算法,比如倒置,查找,插入,删除,排序,这些算法都非常重要,下面首先介绍倒置。

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int a[5] = {1,2,3,4,5};
    int b[5]; // 用来存放倒置后的数据
    int i,j;
    for (i=0,j=4; i<5,j>=0;++i,--j)
    {
        b[i] = a[j];
        printf("%d\n",b[i]);
    }
    return 0;
}

数组倒置——互换算法

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int a[23] = {1,5, 66,8,55,9,1,32,5,65,4,8,5,65,4,8,5,15,64,156,1564,15,1,8,9,7,215};
    int i = 0; // 循环变量1,i的值为数组第一个元素的下标
    int j = 22; // 循环变量2,j的值为数组第一个元素的下标
    int buf;    // 互换时的中间存储变量

    for (; i < j;++i, --j)
    {
        buf = a[i];
        a[i] = a[j];
        a[j] = buf;
    }
    for (int i = 0; i < 23; ++i)
    {
        printf("%d\x20",a[i] ); // \x20表示空格
    }
    printf("\n");
    return 0;
}

2.顺序查找算法

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int a[] = {
        1,5,66,8,55,9,1,32,5,65,4,8,5,
        65,4,8,5,15,64,156,1564,15,1,8,
        7,12,50,62,3,65,906,176,51,21,13
    };

    int n; // 存放数组a中元素个数
    int m; // 查找的数字
    int i; // 循环变量

    n = sizeof(a)/sizeof(int);

    printf("请输入一个数字:");
    scanf("%d",&m);
    for (int i = 0; i < n; ++i)
    {
        if (a[i] == m)
        {
            printf("下标 = %d\n",i);
            break;
        }
    }
    if (i == n)
    {
        printf("sorry\n");
    }
    return 0;
}

输出:

请输入一个数字:7
下标 = 24

3.折半查找

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int a[] = {13,45,78,90,127,289,243,355};
    int key;    // 存放要查找的数

    int low = 0;
    int high = sizeof(a)/sizeof(a[0])-1;
    int mid;

    int flag = 0;   // 标志位,用于判断是否存在要找的数
    printf("请输入您要查找的数:");
    scanf("%d",&key);

    while (low<=high) {
        mid = (low+high)/2;

        if (key<a[mid]) {
            high = mid-1;
        }
        else if (a[mid]<key){
            low = mid+1;
        }
        else{
            printf("下标 = %d\n",mid);
            flag =1;
            break;
        }
    }
    if (0 == flag) {
        printf("sorry,data is not found\n");
    }

    return 0;
}

输出:

请输入您要查找的数:13
下标 = 0

4.插入算法

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int a[23] = {1,5,66,8,55,9,11,25,7,96,20,95,72,8,67,33,41,68,23,45,66,88,92};
    int b[24];  // 插入数据后的新数组
    int index;  // 下标
    int num;    // 插入的值
    int i;  // 循环变量

    printf("请输入插入值的下标:");
    scanf("%d",&index);
    printf("请输入插入的值:");
    scanf("%d",&num);

    for (i = 0; i<24; ++i) {
        if (i <index) {
             b[i] = a[i];   // i小于插入位置index时,每一个元素所存放的位置不变
        }
    else if(i == index){
        b[i] = num;     // i= index时,将插入值赋给数组b
    }
    else{
        b[i] = a[i-1];  // 插入位置后的每一个元素所存放的位置后移一位
    }
}
    for (i = 0; i<24; ++i) {
        printf("%d\x20",b[i]);
    }
    printf("\n");
    return 0;
}

输出:

请输入插入值的下标:4
请输入插入的值:77
1 5 66 8 77 55 9 11 25 7 96 20 95 72 8 67 33 41 68 23 45 66 88 92 

5.删除算法

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int a[23] = {1,5,66,8,55,9,11,25,7,96,20,95,72,8,67,33,41,68,23,45,66,88,92};
    int b[22];  // 删除数据后的新数组
    int index;  // 要删除的值的下标
    int i;  // 循环变量

    printf("请输入删除的下标:");
    scanf("%d",&index);


    for (i = 0; i<23; ++i) {
        if (i<index) {
            b[i] = a[i];    //i小于插入位置index时,每一个元素所存放的位置不变
        }
        else{
            b[i] = a[i+1];  // 删除值后面的元素都向前移动一位,要删除的值被覆盖
        }
}
    for (i = 0; i<22; ++i) {
        printf("%d\x20",b[i]);
    }
    printf("\n");
    return 0;
}

输出:

请输入删除的下标:5
1 5 66 8 55 11 25 7 96 20 95 72 8 67 33 41 68 23 45 66 88 92 
Program ended with exit code: 0

仓库地址


  转载请注明: 张 雄 算法入门(01)

 上一篇
二次元+主题测试 二次元+主题测试
下辈子,我想倒着活一回。 第一步就是死亡,然后把它抛在脑后。 在敬老院睁开眼,一天比一天感觉更好,直到因为太健康被踢出去。领上养老金,然后开始工作。 第一天就得到一块金表,还有庆祝派对。40年后,够年轻了,可以去享受退休生活了。 狂欢,喝酒
2019-04-04
下一篇 
你来人间一趟 你要看看太阳 你来人间一趟 你要看看太阳
搬运几首我喜欢的他的诗想起你 我今夜跑尽这空无一人的街道 明天,明天起来后我要重新做人 我要成为宇宙的孩子 世纪的孩子 挥霍我自己的青春 然后放弃爱情的王位 去做铁石心肠的船长 ——眺望北方 夏天的太阳夏天 如果这条街没有鞋匠 我就
2019-03-26
  目录