相关博客目录
C++程序设计基础学习笔记:(1)初识C++语言:从认识变量和常量开始,数据的表示
C++程序设计基础学习笔记:(2)计算:从数据运算开始,数据简单运算
C++程序设计基础学习笔记:(3)分支结构:无处不在的抉择
C++程序设计基础学习笔记:(4)循环结构:周而复始,求同存异
C++程序设计基础学习笔记:(5)数组:实现算法的利器
C++程序设计基础学习笔记:(6)指针:所向披靡的“金箍棒” 魂
C++程序设计基础学习笔记:(7)函数:面向过程的基础
C++程序设计基础学习笔记:(8)文件:让数据流动起来
C++程序设计基础学习笔记:(9)以人为本:用类与对象诠释现实世界
C++程序设计基础学习笔记:(10)从生物遗传说起,取其精华——继承与多态
第5章 数组:实现算法的利器
数组由确定数目的相同数据类型的元素顺序排列而成的结构类型数据
C++中数组大小在编译时确定
编译系统按照定义为数组分配一段连续的存储单元
这段单元的大小是不能改变的,因此数组大小不能用变量定义,而只能是一个正整数常量。
为避免使用时数组出界,通常“大开小用”。
数组优势
数组元素统一命名:第i个元素:数组名[i]
可以以相同的语句实现对数组元素的操作
提高语句的通用性,简化程序
5.1一维数组:从多个圆大小排序看一维数组
一维数组的定义
数据类型数组名[常量表达式];
在方括号中的常量表达式用来定义数组大小,即数组中元素的个数。
数组由确定数目的相同数据类型的元素顺序排列而成的结构类型数据
数组元素的访问
数组元素可以独立访问
数组元素的访问:数组名[下标表达式]
一维数组的初始化赋值
数组初始化:在定义数组的同时为数组元素赋值
数组初始化方式:用大括号列出元素的值
初始化可以实现数组的整体赋值
一维数组的访问
数组名[下标表达式]
5.2数组应用:查找算法
数据存放的方式决定数据查找的方法
顺序查找
从数组(或线性数据表)中的第一个(或最后一个)记录开始查找
依次将记录的关键字与查找关键字进行比较
当某个记录的关键字与查找关键字相等时,即查找成功
反之,查完全部记录都没有与之相等的关键字,则查找失败
折半查找(二分查找)
适用条件
数组(或线性表)中的数据(或记录按关键码)必须排序;
必须采用数组顺序存储。基本思想:
在有序数组(或表)中,取中间数据(或记录)作为比较对象,若给定值与中间数据(或记录的关键码)相等,则查找成功;若给定值小于中间数据(或记录的关键码),则在中间数据(或记录)的左半区继续查找;若给定值大于中间数据(或记录的关键码),则在中间数据(或记录)的右半区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。
折半查找的性能
折半查找的优点
比较次数少,查找速度快,平均性能好
每执行一次,都将查找空间减少一半,是计算机科学中分治思想的完美体现
最多所需的比较次数是第一个大于表中元素个数的2的幂次数如:10个数(2^4>10),最多比较的次数是4折半查找的缺点
要求待查表按关键字有序排列,否则需要
5.3数组应用:冒泡排序
排序(Sorting):
排序就是把一组数据(或记录)按照某个(或某几个)字段的值以递增(由小到大)或递减(由大到小)的次序重新排列的过程。(如按年龄从小到大排序)
排序的类型
内排序:在排序过程中,全部数据存放在内存 (冒泡排序、选择排序、插入排序等))
外排序:排序过程中需要使用外存
排序算法的评价
执行算法所需的时间
执行算法所需要的附加空间
算法本身的复杂程度
算法执行中的比较次数(必须)
算法执行中的移动次数(有可能避免)
通常会关注最坏情况和平均情况的开销
冒泡排序算法
假设有n 个数, 将相邻的两个数依次进行比较, 使小的在前, 大的在后, 那么第一轮比较n-1 次就把最大的数排到了最后。
第二轮比较n-2 次, 就把次大的数排到了倒数第二, 依此类推, 直到第n-1 轮比较1 次, 将最小的数排到了第一, 算法结束。
算法的整体思路是让大的数不断地往下沉, 小的数不断地往上冒, 所以叫"冒泡排序法"。
冒泡排序的算法评价
若数据初始为正序,则一趟冒泡就可完成排序,比较次数为n-1,且没有数据移动,时间复杂度是O(n)
若数据初始为逆序,则需要n-1趟冒泡,每趟进行n-i次的比较,且每次比较都移动三次(a->temp,b->a,temp->b),比较和移动次数均达到最大值∶
冒泡排序最好时间复杂度是O(n)
冒泡排序最坏时间复杂度为O(n2)
冒泡排序平均时间复杂度为O(n2)
冒泡排序算法中增加一个辅助空间temp,辅助空间为S(n)=O(1)
冒泡排序是稳定的
5.4数组应用:巧用数组下标
数组与数组下标
把具有相同类型的若干变量,按照有序的形式组织起来就形成了数组,
数组下标是单独访问每一个数组元素时使用的索
int a[10]
; 一个整型的数组a,有10个元素:
a[0] a[1] a[2] ……a[9],
正确的下标应该是从0开始,到9结束,表示了十个变量,如果写a[10]是错误,即数组下标越界。数组下标的数据类型一般为整型,取值范围从0开始的非负整型值,当数组中每个元素都只带有一个下标时,称这样的数组为一维数组
5.5 二维数组:从计算多个学生多门成绩看二维数组
二维数组和多维数组
二维数组定义
二维数组存储
二维数组的初始化
二维数组使用
5.6 二维数组应用:多个学生多门课成绩计算总分并排序输出
5.7 字符数组与字符串
举例1
问题一:
char a = "M";
字符变量a只能存放一个字符,而“M”占了2个字符:一个字符’M’,一个字符串结束符’\0’
问题二:
char b[] = "爱";
b有几个字节 (3个:中文都是双字节的,还有一个结束符)
问题三:
char str[] = {'C','+','+',"爱"};
理论上来说是不符合定义的,但是否可行需要验证一下(存疑)
举例2
中文都是双字节的,需要一起输出
字符串与一维字符数组
字符数组的输入与输出
字符数组的输入
用“cin>>数组名”的形式输入时
遇到空格,Tab键,回车键表示数据之间分隔;回车键还表示输入结束
用“cin>>数组名”输入单个字符串时,其中不能有空格
用“cin>>数组名”输入多个字符串时,可以以空格分隔
输入字符串中包含空格字符,使用cin.getline函数
cin.getline(字符数组名,字符个数n)
输入回车表示输入结束
输入字符的数量(不包括回车)最大为n-1个
输入的字符后自动添加串结束符’\0’,
作为字符串放入数组中
如果输入字符的数量(不包括回车)大于n-1个,
将前n-1个字符放入数组
混合使用cin和cin.getline:可能会导致烦人且难以发现的问题
字符数组的输出
cout遇到’\0’才结束输出
5.8 字符串的应用
字符数组与数值数组的区别
相同点:定义格式一样,可以使用循环访问每个元素
不同点1:循环控制条件不一样;
不同点2:字符数组可以使用数组名整体访问整个字符串
字符数组的赋值
必须使用循环语句逐字符赋值:
不能使用变量给变量赋值
]
字符串常用的函数
字符串赋值(拷贝)strcpy( str2,str1);
字符串的比较 strcmp(字符数组名1,字符数组名2);
字符串长度计算 strlen(字符数组名); (不计算结束符号)
字符串的连接 strcat(字符数组名1,字符数组名2 );
一维字符数组的遍历框架
一维字符数组例子
]
]