一、数组:相同类型数据的有序集合
数组,本质上是一组相同类型数据的集合,或者说是一组相同类型变量的集合。数组中的每个变量被称作元素。例如,在处理班级学生成绩时,如果有30名学生,使用数组就可以轻松定义存储这些成绩的变量: int score[30]; 相较于逐个定义变量,数组的这种表示方式不仅简洁,而且便于统一管理和操作。
数组分类
1. 一维数组:
- 整型一维数组:专门用于存储整型数据,如 int numbers[10]; ,可以存放10个整数。
- 字符型一维数组:用于存储字符数据,例如 char letters[20]; ,可容纳20个字符。
2. 二维数组:
- 整型二维数组:可看作是具有行列结构的整型数据表格,比如 int matrix[3][4]; ,表示一个3行4列的整型数组。
- 字符型二维数组:常用于存储多个字符串,像 char words[5][10]; ,能存放5个长度为10的字符串。
数组定义
一维数组的定义遵循 类型说明符 数组名 [常量表达式] 的形式:
1. 类型说明符:它明确了数组中数据的类型。既可以是基本数据类型,像整型( int 、 short 、 long 、 long long )、浮点型( float 、 double )、字符型( char );也可以是其他构造类型。其作用就是表明数组中存放的数据类型。
2. 数组名:作为数组的标识,必须遵循标识符命名规则,方便在程序中引用该数组。
3. 常量表达式:用 [] 包围的整型数值,它代表数组中元素的数量,即数组长度。例如 int score[30]; 定义了一个包含30个 int 型变量的数组。
需要注意的是,数组本身属于构造类型,由基本类型与 [] 组合而成。在识别数据类型时,以 int score[30] 为例,去掉 score 后, int[30] 就是该数组的数据类型,它表示能存放30个 int 型变量的一类数据。虽然从概念上 int[30] a; 容易理解,但C语言语法要求写成 int a[30]; 才正确。
数组初始化
1. 全部初始化: int a[10] = {1,2,3,4,5,6,7,8,9,10}; ,这种方式将数组的10个元素都赋予了特定值。
2. 部分初始化: int a[10] = {1,2,3,4,5,6}; ,数组前6个元素被赋值,其余未初始化的元素默认初始化为0。
3. 初始化为0: int a[10] = {}; 或者 int a[10] = {0}; 这两种方式都能将数组所有元素初始化为0。
4. 未初始化: int a[10]; ,此时数组元素的值是随机的,在使用前需谨慎处理。
数组的赋值与输入
数组不能进行整体的赋值或输入操作,必须逐个对数组元素进行处理。例如,给数组元素赋值:
int a[5];
a[0] = 1;
a[1] = 2;
// 以此类推对其他元素赋值
输入数组元素时同样需要逐个进行,通常借助循环实现。
数组使用注意事项
1. 数组不能整体赋值:这是C语言数组的特性,必须逐个元素赋值。
2. 数组名含义:对于 int a[10]; , a 代表的数组类型是 int[10] ,其值为数组首元素的地址,即 &a[0] 。理解数组名的这两个方面含义,对于正确使用数组至关重要。
3. 数组越界:编译器一般不会主动检查数组越界情况,这就要求程序员在编写代码时格外小心,避免因数组越界访问导致程序出现难以排查的错误。
二、排序算法:数据的有序化魔法
选择排序
1. 思想:选择排序的核心思想是为每个位置选择合适的数。具体来说,在每一轮排序中,从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
2. 代码实现:
// 选择排序
for (i = 0; i < n - 1; ++i) {
for (j = i + 1; j < n; ++j) {
if (a[j] < a[i]) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
在上述代码中,外层循环控制排序的轮数,每一轮确定一个位置的元素;内层循环用于在剩余未排序元素中找到最小元素,并与当前位置元素交换。
冒泡排序
1. 思想:冒泡排序的思路是让相邻的两个元素两两比较,根据比较结果将小的元素放在前面,大的元素放在后面。每一轮比较都会将当前未排序部分的最大(或最小)元素“冒泡”到最后(或最前)位置。
2. 代码实现:
// 冒泡排序
for (i = n - 1; i > 0; --i) { // 控制趟数
for (j = 0; j < i; ++j) { // 控制一趟的比较过程
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
外层循环 i 控制排序的趟数,每趟会将一个最大元素移到数组末尾;内层循环 j 控制每一趟中相邻元素的比较与交换。
数组与排序算法是C语言编程的重要基石。深入理解数组的概念、定义、初始化及使用注意事项,熟练掌握选择排序和冒泡排序等基本算法,将有助于我们编写出更高效、更健壮的程序。希望大家通过不断实践,灵活运用这些知识,提升编程能