极简嵌入式C语言教程——从入门到入土(4)

第三章 数组,简单算法与指针(上)

1.数组

(1)总述

  数组,顾名思义,是一个或几个数在一起的组合。

int a[5]={1,2,3,4,5}; //基本的数组定义方法,数组类型由数组前的关键字决定,数组中的数字或字符被称为元素,方括号中的数字代表数组a中元素的个数,这个数组就是一个整型数组
float b[]={1,2,1,5}; //数组也可以将元素个数空着,但后面一定要有数组中的元素
char c[15];          //数组还可以和变量一样,只声明数组,不对数组赋值
double d[];          //这种既没有数组赋值,也没有数组元素个数的声明是错误的

(2)一维数组

  形如总述中提到的:

int a[5];  float b[3];

只有一个方括号的,就是一维数组。可以理解成,一条只有一边有房间的直线走廊:
1
值得一提的是,在引用数组时,数组的编号是从0开始的。

int a[7]={1,5,9,7,5,32,4}; //这里的a[7]方括号中的7代表元素个数;
int b[7];                  //这里的a[7]方括号中的7代表元素个数;
b[1]=a[6];                 //这里的b[1]和a[6]方括号中的数字分别代表第2和第7个元素
for(int i=0;i<7;i++)       //这里的a[i]表示数组a第i个数据,b[i]同
{
  b[i]=a[i];
}

 通过示例可以看出,当一维数组在声明阶段时(int a[5];),方括号内的数字代表一维数组内元素个数;当一维数组在引用阶段时(a[4]=40;),a[n]方括号内的数字代表一维数组的第n+1个元素,这时的[4]也被称为数组的下标。

(3)二维及多维数组

  用数学中坐标系的概念可以解释数组的维度概念,一维数组是一个数轴,一维数组中的一个元素就可以类比于数轴上的一个点,这时,点的维度是一维。
2
  二维数组可以类比于拥有x轴和y轴两个维度的笛卡尔坐标系,在二维坐标系中,一个点由横坐标x与纵坐标y共同确定,这时点的坐标是二维。
3
 解释完数组维度的概念,接下来我将用一种更好理解的方式表示二维数组。
4
 这是一个5×2(五行两列)的表格,当x=5,y=1时,他们所指向的数字是45。因此,我们仿照一维数组定义二维数组有:

int array[5][2]={{5,5},{4,2},{3,2},{5,3},{3,0},{1,45}} ;
int b;
//👆建立一个五行两列的数组array,
b=array[2][0];//二维数组存储的数据更多,但占据的内存也更大,使用也更加繁琐(需要考虑两个下标)
printf("%d %d %d\n",array[0][0],array[4][1],b);

 同理,三维以及更高维的数组均可以按照这个思路与相应的维度坐标系建立联系。此外,数组还可以被更多的意义,这里暂不赘述,等待你们自己去发掘去理解。

2.简单算法(不含指针)

(1)算法与计算机算法

 引百度百科解释何为算法:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
 计算机算法是算法中的一种,是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程,或者说,算法是对计算机上执行的计算过程的具体描述。
 严格意义上来讲,只要编写的程序计算机能够运行,那么用于实现这个目的的程序都可以被称为算法。因此,代码的执行效率高与低就与算法的复杂度有关。
 对于初学者而言,在这里算法与算法复杂度以及对应的计算评判标准不进行详细叙述。(要真想精研算法,真有兴趣我可以单独出一期)

(2)简单算法初步

注:这里只列出简单算法及简单算法的原理,不对其时间和空间复杂度做评价。

<1>换序(交换数值)

 例1:a=3,b=4.编写程序,将变量a的值与变量b的值进行交换:

给出代码如下(以下均省略主函数与头文件):
int a=3,b=4;
int temp;    //定义临时交换变量
printf("初始:a=%d,b=%d\n",a,b);
temp=a;
a=b;
b=temp;
printf("交换后:a=%d,b=%d\n",a,b);
<2>冒泡排序法

  例2:编写程序,将数组array[ ]={0,15,44,8,123,-5,78,1}中的元素按从小到大的顺序排列,并输出排序前后的数组:

int array[]={0,15,44,8,123,-5,78,1};
int temp;       //定义临时交换变量
printf("排序前:数组为:\n");
for(int i=0;i<8;i++)
{
  printf("%d     ",array[i]);
}
/************以下为冒泡排序法主体部分****************/
for(int m=0;m=7;i++)
  for(int n=0;n<n-m-1;n++)
  {
    if(array[n]>array[n+1]);
    {
      temp=array[n];
      array[n]=array[n+1];
      array[n+1]=temp;
    }
  }
/************以上为冒泡排序法主体部分****************/
printf("排序后:数组为:\n");
for(int i=0;i<8;i++)
{
  printf("%d     ",array[i]);
}

解释:冒泡排序法的核心思想是将相邻的两个数值作比较,如果达到要求就进行换位,反复执行多次,直到全部比较换位完毕。

<3>二分查找法

 例:查找数组array[ ]={-89,-15,-9,1,9,12,48,56,112,1235}中是否含有元素9,如有,请输出其在数组中的位置,如果没有则输出“不存在!”:

int array[10]={5,8,9,54,15,0,19,1323,22,7};
int target=9;                //查找目标为9
int bottom=0;                //设置查找下界
int top=10-1;                //设置查找上界
int location;                //目标位置
int mid;                     //中间位置游标
int flag;                    //查询标志位
/***************以下为二分查找法主体*****************/
while(top>=bottom)
{
  mid=(bottom+top)/2;
  if(array[mid]=target)
  {
    location=mid;
    flag=1;
    break;
  }
  else if(array[mid]>target)
  {
    top=mid-1;
  }
  else bottom=mid+1;
}
if(flag==0)
{
  printf("不存在\n");
}
else printf("9 在数组中的位置是:%d\n",location+1);

解释:能够使用二分查找法(也叫折半查找法)的数据必须是有序的,若数据无序,则需要在折半查找之前对数组内元素进行排序。二分查找法的运算过程与方程二分法求近似解有极多相似之处,望自行发掘。



tips:本期博客内容就到这里了,预计第三章数组,简单算法与指针共有上、中、下三篇文章,敬请期待。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修灯泡的老张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值