在嵌入式中,对算法的要求不高,但顺序查找和冒泡排序是经典算法,必须掌握。
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.查找算法
顺序查找又称线性查找,是一种基本的查找算法,其原理是:
- 从头开始遍历:从数据集的起始位置开始,逐个检查每个元素。
- 比较目标:对于每个遍历到的元素,将其与目标元素进行比较。
- 查找成功:如果当前元素等于目标元素,则查找成功,返回当前元素的索引。
- 查找失败:如果遍历完整个数据集仍未找到目标元素,则查找失败,返回一个特殊的标识来表示未找到。
代码实现:
//顺序查找
//定义函数寻找数组元素的索引
#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;
}