数组
零、题外话:linux中代码的快捷对齐方式
单行对齐:在命令模式下 按两下等号
多行对齐:shift+v选中 按一下等号
起始行 = 结束行
全局对齐:
gg = shift + g
一、数组概念:
一组相同类型的数据的集合
要怎么一次性定义多个变量? //本质上是 相同类型变量的集合
一维数组
二维数组
整型 字符型
--------------------------------------
语法: //定义数组
类型说明符 数组名[常量表达式];
(1).类型说明符
整型
int,short,long,long long
浮点
字符
(2).数组名
代表着 数据集合 (内存空间的一个名字)
(3).[] //表示此时定义的是一个 数组
(4).常量表达式
表示数组的长度 --- 变量的个数
eg:
int array[5]; //定义一个数组,这个数组放了5个 int 形变量
数组本身也是一种数据类型
类型 ---
类型:
常量
变量
大小
内存
int a = 10; //a int型
int [10]; //a所代表的类型 是
int[10] a; //a所代表的类型 int[10] (不能这么写)
//a ---把名字去掉,剩下的就是名字对应的数据类型
int a[10]; //数组在内存空间上的特点
a代表数组所在空间名字,数组首元素的地址编号
//数组的给值
//初始化
//赋值
int a[10] = {1,2,3,4,5,6,7,8,9,10}; //{}表示初始化 花括号叫 初始化器
//全部初始化
//数组元素的访问
语法:
a[下标]; //这里的下标是 从0 开始的 数组名中的标号是 从1 开始的
数组下标:
本质上是 偏移量
二、数组的特点:
连续性 -- 占用一片连续空间
有序性 -- 元素一次存储
单一性 -- 单一(相同)类型的元素
a[i] //下标运算 --- 实际是一个地址的运算
下表本质上是一个偏移量
数组的越界问题:
1.不是语法问题 --- 编译器不报错
2.程序员如何避免? --- 自己小心吧
注意:
a.数组名
代表的数据类型 -- int a[10]; //a所代表的类型为int[10] //数组类型
代表的值 -- 数组首元素的地址
b.数组长度 与 下标
数组长度 -- 表示几个元素(变量)
下标 -- 偏移量
[0~数组长度-1]
int a[10] = {1,2,3,4,5,6,7,8,9,10};//全部初始化
int a[10] = {1,2,3,4,5}; //部分初始化 -- 依次给数组元素初始化 没有给值的元素 默认初始化为0
int a[10] = {};
int a[10] = {0};
如果数组不初始化 --- 数组中为垃圾值
数组长度可以省略 但必须要有初始化的值
int a[]={1,2,3}; //编译器会根据值来 计算 数组长度
数组赋值 不能整体赋值 需要一个元素一个元素给到
练习:
准备一个数组 找最大值 次大值
三、排序
按一定的顺序排序
升序 1 2 3 4
降序 4 3 2 1
1.选择排序:
思想:
为合适的位置,选择一个合适的数;
0 1 2 3 4 5 6 7 //下标
1 5 3 6 8 7 2 4 //数值
1. 选择排序法(非常关键说是
for (i = 0; i < len-1; ++i) //位置 i = len-1 ---控制位置
{
//找最小值
//i = 1;
for (j = i+1; j < len; ++j) //找数
{
if (a[j] < a[i])
{
交换
}
}
}
主要思想:永远选最小数 放到最前面的位置
2.冒泡排序法(也非常关键
for(i=0;i<len-1;++i)
{
for(j=i+1;j<len;++j)
{
if(a[j]<a[i])
{
mid = a[i];
a[i] = a[j];
a[j] = mid;
}
}
}
主要思想:两项比较 大的往后跑 一轮选出一个最大值 n-1轮就能全换对