今天系统学习了C语言一维数组相关知识,熟悉数组基础操作,重点弄懂冒泡排序和选择排序两种基础算法,在这里整理知识点分享给大家。
一、一维数组基础
数组定义
数组可以存储一组数据类型相同的数据,所有元素在内存里连续存放。
书写格式:
数据类型 数组名[元素数量];
注意:方括号内的元素数量只能写常量,不能直接使用变量。数组元素访问
读取、修改元素格式:数组名[下标]
数组下标从0开始,有效区间是 0 ~ 元素个数-1。下标可以填写常量、变量或者表达式。
千万不要访问超出范围的下标,也就是数组越界,程序会出现无法预料的错误。计算数组长度
不用手动去数元素个数,可以借助sizeof自动计算:
int len = sizeof(a)/sizeof(a[0]);
sizeof(a) 获取整个数组占用的总字节,sizeof(a[0]) 代表单个元素占用字节,两者相除得到元素总数。数组初始化
完整初始化
int a[5]={1,2,3,4,5};
部分初始化,没有赋值的元素默认自动置0
int a[5]={1,2,3};
省略数组长度,编译器根据初始化内容自动判定长度
int a[]={1,2,3,4,5};
注意:数组没办法整体赋值,如果需要修改所有元素,只能通过循环逐个操作。
二、数组常见基础应用
- 通过循环读取控制台输入的数据存入数组,也能循环遍历打印全部元素;
- 遍历数组查找最大值、最小值,同时记录最值所在的下标;
- 数组逆置:交换数组前后对应的元素,循环条件设置为 i < len/2。
三、冒泡排序
核心原理:
不断对比相邻的两个元素,如果大小不符合排序要求就交换二者。每一轮循环结束后,未排序区域中最大的元素会排到末尾。
外层循环:控制一共需要多少轮排序,总共执行 len-1 轮
内层循环:负责相邻元素对比交换。每一轮结束后末尾多出一个有序数据,所以内层循环边界要减去已经完成排序的轮次。
for(j = 0; j < len-1; j++)
{
for(i = 0; i < len-1-j; i++)
{
if(a[i] > a[i+1])
{
int tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
}
}
}
四、选择排序
核心原理:
先暂定当前位置的元素是最小值,接着向后遍历还没有排序的数据,找到真正最小值的下标。一轮遍历结束后,把最小值交换到当前位置。
简单区分两种排序:冒泡排序会频繁交换相邻元素;选择排序每一轮最多只交换一次。
外层循环:依次确定数组每一个位置最终存放的数据
内层循环:在未排序区间寻找最小值对应的下标
for(j = 0; j < len-1; j++)
{
int min = j;
for(i = j+1; i < len; i++)
{
if(a[i] < a[min])
{
min = i;
}
}
if(min != j)
{
int tmp = a[j];
a[j] = a[min];
a[min] = tmp;
}
}
在学习冒泡排序和选择排序的过程中我们应该注意:
- 分清两层循环各自的作用,外层控制排序轮次,内层完成元素比较或者查找最值;
- 循环边界不能随意改动,边界出错容易出现排序不完全、数组越界等问题;
- 理解两种排序各自的逻辑,不要混淆代码结构。
最后,数组是批量处理数据非常重要的工具,冒泡、选择排序也是入门算法。大家不用死记硬背代码,试着一步步推演循环运行过程,多敲多练,更容易吃透算法逻辑。