五、数组及其冒泡选择排序

【1】数组

1.概念:

一组同种类型的数据的集合

2.特点:

1)类型相同
2)顺序存储
3)地址连续

3.定义格式:

​ [存储类型] [数据类型] 数组名[大小];
​ (auto) int num[10];
​ 大小:元素个数
​ 数组名:1)遵守标识符命名规则
​ 2)数组名代表数组的首地址 num <=> &num[0]
​ 数组元素:下标从0开始到n-1 num[0] ~ num[9]

4.数组初始化:
1.全部初始化

  int num[5] = {1,2,3,4,5};
		  初始化完成后的效果:
		  num[0] = 1;
		  num[1] = 2;
		  num[2] = 3;
		  num[3] = 4;
		  num[4] = 5;
2.部分初始化

	  int num[5] = {1,2};
		  初始化完成后的效果:
		  num[0] = 1;
		  num[1] = 2;
		  num[2] = 0;
		  num[3] = 0;
		  num[4] = 0;
          数组部分初始化时,未被初始化的元素默认为0.		  

3.未初始化
      int num[5];
​		  数组未初始化时,元素均为随机值。
​		  

​	  //int num[5];
​	    num[0] = 1;
​		num[1] = 2;

//未初始化,后对前两个元素分别赋值,所以未被赋值仍是随机值。
数组的大小:
​ 元素个数 * 数据类型字节数

	 char  ch[5] = {'!','@'};     //5字节 
	 int   num[5] = {1,2,3,4,5};  //20字节
	 double db[8];                //64字节

5.数组的输入和输出:
  int num[5] = {0};
	scanf("%d",&num[0]);
	scanf("%d",&num[1]);
	....
	scanf("%d",&num[4]);
    循环优化:
	int i;
	for(i=0;i<5;i++)
	{
	   scanf("%d",&num[i]);		
	}
	数组的遍历:
	for(i=0;i<5;i++)
	{
	   printf("%d ",num[i]);		
	}		
	putchar(10);


​ 练习:按学生学号给22031班10位同学录入C语言成绩,
​ 学号:2203101~2203110
​ 要求:求出该班C语言的平均分,
​ 以及成绩最高的同学学号和成绩不及格的同学学号打印到终端。

【2】排序算法示例

1.冒泡排序

​ 将5 4 3 2 1
​ 五个数按照冒泡排序算法
​ 从小到大排
​ 第一轮:
​ 4 5 3 2 1
​ 4 3 5 2 1
​ 4 3 2 5 1
​ 4 3 2 1 5
​ 第二轮:
​ 3 4 2 1 5
​ 3 2 4 1 5
​ 3 2 1 4 5
​ 第三轮:
​ 2 3 1 4 5
​ 2 1 3 4 5
​ 第四轮:
​ 1 2 3 4 5

算法实现:
N个数从大到小排序:
for循环嵌套:外层循环控制比较轮数,内存循环控制每轮比较次数。
比较轮数:N - 1
比较次数:从N-1逐渐递减

 for(i=0;i<N-1;i++)
 {
     for(j=0;j<N-1-i;j++)
     {
         if(num[j]<num[j+1])
         {
             tmp = num[j];
             num[j] = num[j+1];
             num[j+1] = tmp;
         }
     }
 }
2.选择排序

N个数从小到大排序:
红色箭头i(锁定):从第一个数开始走到倒数第二个数
0 -> N-2
绿色箭头j(遍历):从红色箭头的下一个一直走到最后一个
i+1 -> N-1
黄色箭头k(标记):如果绿色箭头找到目标数据,标记位置。
一开始先让k指向i指向的数据,便于后续j和k进行比较。
算法实现:

for(i=0;i<N-1;i++)
{
   k = i;
   for(j=i+1;j<N;j++)
   {
       if(num[j]<num[k])
       {
          k = j;
       }
   } 
   if(k!=i)
   {
      tmp = num[i];
      num[i] = num[k];
      num[k] = tmp;
   }
}

【3】二维数组

1 概念:

​ 有行有列的数组称为二维数组

2.定义格式:

​ [存储类型] [数据类型] 数组名[行数][列数];
​ (auto) int num[10][10];
​ 元素个数:行数 * 列数

3.数组初始化:
1.全部初始化

	  int num[2][3] = {1,2,3,4,5,6};
		  int num[2][3] = {{1,2,3},{4,5,6}};		  
		  初始化完的效果:
		  num[0][0] = 1;
		  num[0][1] = 2;
		  num[0][2] = 3;
		  num[1][0] = 4;
		  num[1][1] = 5;
		  num[1][2] = 6;

​ | 1 2 3 |
​ | 4 5 6 |

2.部分初始化

  int num[2][3] = {1,2};
      | 1  2  0 |
      | 0  0  0 |			  
	  int num[2][3] = {{1},{2}};		
      | 1  0  0 |
      | 2  0  0 |	
      数组部分初始化时,未被初始化的元素默认为0.		  

3.未初始化
     int num[2][3];
      //均为随机值	  
数组的大小:
    行数 * 列数 * 数据类型字节数
	int num[2][3]; //2*3*4 = 24字节
4.二维数组的输入输出:
    int num[2][3] = {0};
	scanf("%d",&num[0][0]);
	scanf("%d",&num[0][1]);
	...
    scanf("%d",&num[1][2]); 
    用for循环优化:
	int i,j;
	for(i=0;i<2;i++)
	{
	   for(j=0;j<3;j++)
	   {
	       scanf("%d",&num[i][j]);
	   }
    }
	for(i=0;i<2;i++)
	{
	   for(j=0;j<3;j++)
	   {
	       printf("%d ",num[i][j]);
	   }
	   putchar(10);
    }	

练习:定义一个三行四列的二维数组,从终端录入数据,
找到最大值和最小值输出,输出时带上元素下标。
例如:
max : num[1][2] = 99
min : num[0][2] = 1

练习:有一个三行三列的矩阵,如下:
| 1 2 3|
| 4 5 6|
| 7 8 9|
求出其非对角线上的元素值的和。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值