数组概念
数组 是 一组相同类型的数据集合 (变量的集合)
整型数组
一维整型
二维整型
字符型数组
一维字符型
数组:
数组也是一种数据类型
int a; //
数据类型 变量名; //标识符
一维整型数组:
类型说明符 数组名[常量表达式];
类型说明符
基本数据类型 int /float /char
数组名
名字 --标识符 -- 命名规则
表示 --你现在定义的是一个数组类型
常量表达式
数组长度 代表的是 批量的定义了多少个 变量(数据)
int a[10]; //表示,定义了一个 包含了 10 个 int元素(变量)的数组
int a; //
数据类型 变量名; //标识符
int a[10]; //标识对应的数据类型怎么看?
//干掉标识符 ,剩下的就是标识符对应的类型
int[10] a; //int[10] --数组类型
数组的给值:
//初始化
int a[10] = {1,2,3,4,5,6,7,8,9,10}; //{} 表示 初始化器
内存放 是怎样存放的?
数组 是一片连续的空间
数组特点:
连续型
单一型
有序性
//数组元素赋值
数组:
1.一组相同类型的数据的集合
2.数组 是一种数据类型 (构造数据类型)
构造数据类型:
数组的定义:
数据类型 数组名[数组长度];
eg:
int a[10];
int
[] //表示的就是数组
数组的特点:
连续性
单一的
有序性
------------------------------
int a[10];
数组给值:
初始化
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] = {0}; //初始化为0
int a[10] = {}; // {} 初始化器 全部初始化为0
int a[10]; //不初始化 --此时每个元素中是随机值
int a[]; //定义数组时,长度可以省略,但是要求,必须有初始化的值
//此时数组长度,由编译器根据 初始化值的个数推算
赋值: //只能给到具体的数组元素
a[0] = 1;
a[1] = 2;
数组每个元素都给到值,需要循环
scanf("%d",&a[0]);
注意:
数组不能整体赋值
a 代表数组整体 这个类型 不能整体赋值
能赋值的是,数组的每个元素
数组的访问:
语法格式:
数组名[下标] // 此时的[]不同于定义时的[],此时的[]表示的是数组下标运算 (运算符)
int a[10];
下标:
整型数
0~数组长度-1
下标的本质--实际上是一个偏移量,针对于数组起始位置的偏移量 //指针
数组名:
数组名[下标] //所谓的数组下标运算,本质上是一个指针运算
数组名 ---所代表的类型 ---数组类型
所代表的值 ---数组首元素的地址
int a = 10;
a[0]
// 1+2
// 2+1
问题:
1. 数组的越界访问
编译器不检查
程序员自己小心
排 序:
升序 1 2 3 4 5 6
降序 6 5 4 3 2 1
时间复杂度
空间复杂度
选择排序:
思想:
给合适位置,(选择)合适的数放
思路:
选择
for (i = 0; i < n-1; ++i)
{
for (j = i + 1; j < n; ++j)
{
if (a[i] > a[j])
{
交换
}
}
}
i = 0 n-1
i = 1 n-2
i = 2 n-3
...
i = n-2 1
1+2 + .... + n-1
(1+n-1)*(n-1) /2
n*(n-1)/2
n^2/2 - n/2
O(n) = n^2 //大O计法
冒泡排序:
思想:
相邻的两个元素,两个比较,小的放前,大的放后。
冒泡:
for (i = 1; i < n; ++i)
{
for (j = 0; j < n-i; ++j)
{
if (a[j] > a[j+1])
{
交换
}
}
}
第1趟 n-1
第2趟 n-2
第3趟 n-3
...
第n-1趟 1