在嵌入式中,对算法的要求不高,但顺序查找和冒泡排序是经典算法,必须掌握。

1.算法定义

算法是一个用于解决特定问题的有限指令序列(计算机可以执行的操作)。通俗的理解就是可以解决特定问题的方法。

2.时间复杂度

时间复杂度不是执行完一段程序的总时间,而是描述为一个算法中基本操作的总次数。

算法中基本操作重复执行的次数是问题规模n的某个函数f(n),其时间量度记作 T(n)=O(f(n)),称作时间复杂度。这里的n称为问题的规模,如要处理的数组元素的个数为n,则基本操作所执行的次数是n的一个函数f(n)。

执行一次程序基本操作为1,双重遍历为平方。

3.空间复杂度

算法的空间复杂度是指算法在运行过程中除了算法本身的指令、常数外,还需要的针对数据操作的辅助存储空间的大小。同样是问题的规模(或大小)n的函数。

空间复杂度(Space complexity) ,记作:S(n)=O(f(n))。

常见的空间复杂度主要有:O(1) 和 O(n)。

空间复杂度与字节相关。

4.查找算法

顺序查找又称线性查找,是一种基本的查找算法,其原理是:

  1. 从头开始遍历:从数据集的起始位置开始,逐个检查每个元素。
  2. 比较目标:对于每个遍历到的元素,将其与目标元素进行比较。
  3. 查找成功:如果当前元素等于目标元素,则查找成功,返回当前元素的索引。
  4. 查找失败:如果遍历完整个数据集仍未找到目标元素,则查找失败,返回一个特殊的标识来表示未找到。

代码实现:

//顺序查找
//定义函数寻找数组元素的索引
#include <stdio.h>
//定义函数
int ordersearch(int array[],int length,int element)//传参为数组类型、长度和元素
{
    for(int i=0;i<length;i++)
    {
        if(array[i]==element)
       {
        return i;
       }
       
    }
      return -1;//如果没有找到元素,就不返回
}
int main()
{
    int arr[]={123,234,455,565,-234,556,23,46};
    //声明数组长度
    int length=sizeof(arr)/sizeof(int);
    //声明索引成为函数的返回值
    int index=ordersearch(arr,length,-234);
    printf("元素的索引是%d",index);
    return 0;
}

5.冒泡排序

‘一组乱序的数列,想要它升序或降序排列。冒泡排序的原理是,从第一个数开始,以第一个数为基准,与它的第二个数相比较,如果小(假如按升序排列),就不动,如果比第二个数大就互换顺序。然后第二个数与第三个数进行比较,依次相比,直到最后一个数,最后一个数就是数列的最大值。然后剔除最后的最大值,继续从前往后比较,直到只剩一个数。最后展现的顺序就是升序排列。

安装原理,实现代码:

#include <stdio.h>
//声明函数,遍历数组
void print(int arr[],int length)
{
 for(int i=0;i<length;i++)
 {
    printf("%d ",arr[i]);
 }
}
int main()
{
    int arr[]={12,88,-9};
    int length=sizeof(arr)/sizeof(int);
    //第一轮
    for(int i=0;i<length;i++)
    {
        if(arr[i]>arr[i+1])
        {
            int tep=arr[i+1];
            arr[i+1]=arr[i];
            arr[i]=tep;
        }
    }
    //第二轮
    for(int i=0;i<length-1;i++)
    {
         if(arr[i]>arr[i+1])
        {
            int tep=arr[i+1];
            arr[i+1]=arr[i];
            arr[i]=tep;
        }
    }
//声明函数
print(arr,length);

    return 0;
}

从上面代码可以看出,如果数组元素非常多的话,我们需要经过很多轮才能输出打印。N个元素N-1轮代码循环。我们可以找出规律简化它。

简化代码演示:

#include <stdio.h>
void print(int arr[],int length)
{
    for(int k=0;k<length;k++)
    {
        printf("%d ",arr[k]);
    }
}
int main()
{
    int arr[]={-12,90,34,78,45,-3};
    int length=sizeof(arr)/sizeof(int);
    for(int i=0;i<length;i++)
    {
        for(int j=0;j<length-i;j++)
        {
            if(arr[j]>arr[j+1])
            {
                int tep=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=tep;
            }
        }
    }
   print(arr,length);
    return 0;
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐