数组及常用算法
- 1.数组基本概念
- 2.一维数组
- 2.1数组的定义
- 2.2数组初始化
- 2.3一维数组动态赋初值
- 2.4一维数组应用实例
- 2.5一维数组的排序算法
- 2.6 一维数组元素的删除和插入
- array
- 3.二维数组
- 3.1数组定义
- 3.2二维数组的动态赋值
《老九学堂C++课程》《C++ primer》学习笔记。《老九学堂C++课程》详情请到B站搜索《老九零基础学编程C++入门》
-------------简单的事情重复做,重复的事情用心做,用心的事情坚持做(老九君)---------------
1.数组基本概念
什么是数组:数组是一个变量,由数据类型相同的一组元素组成,在内存占一串连续的内存空间。
数组是一个类型:比如int 型的数组,类型就是int []
C++中数组元素必须拥有相同的数据类型加粗样式
数组基本要素:
1.表示符:数组的名称,用于区分不同的数组(用来表示数组的变量名)
2.数组元素:向数组中存放的数据
3.元素下标:对数组元素进行编号,表明元素在数组中的位置。从0开始,可以通过下标来访问数组
4.元素类型:数组中元素的数据类型
数组长度固定, 避免数组越界
使用数组的优点: 方便管理需要相同操作的数据
demo1:可以构成数组的一组元素?
在C/C++中可以构成一个数组,在java中不行
198, 98, ‘c’, 230 // 字符在C++中是整形存的
1, 0, true, false, 38, -1 // c++中布尔类型实际是整形
2.一维数组
可以存成数组的情况:学生单门学科的成绩,某类商品的单价,某人N个月的工资
2.1数组的定义
定义语法:
datatype arrayName[size];
demo:
int nums[25];
char array_of_name[30];
double curr_salary[35];
const int N = 5;
int nums[N];
nums[0] = 9527;
const int N = 5;
int nums[N];
nums[0] = 9527;
注意:C++中数组的大小可以定义变量,C中不可以可以定义成变量
2.2数组初始化
用大括号初始化元素内容
int years[6] = {2012,2013,2014,2015,2016,2017}; //可以少给元素,但是不能多给
int months[12] = {1, 3, 5, 7}; // 未初始化的元素默认值未0
int days[] = {1,15}; // 不设定数组大小,编译器自动计算数组大小
int array[] = {} // ❌,未知元素个数是不可以的
c++ 11中新的改动:
a.初始化是可以不用等于号;
b.大括号可以为空,默认为所有元素执行置0操作
int days[] {};
float m[100] {};
2.3一维数组动态赋初值
动态从键盘录入信息,赋值给数组
int main(){int N = 5;double scores[N];//for(int i = 0; i < N; i++){for(int i = 0; i < sizeof(scores) / sizeof(double); i++){cout << "请输入第" << i + 1 << "课程的成绩:" ;cin >> scores[i];}for(int i = 0; i < N; i++){cout << scores[i] << endl;}return 0;
}
注意C++中数组没有.len()的属性,没法直接获得数组的长度。
2.4一维数组应用实例
demo1:一维数组求和,求平均
int main(){
int main(){int nums[7] = {8, 4, 2, 1, 23, 344, 12};int nums_len = sizeof(nums) / sizeof(nums[0]);int sum = 0;double average = 0;for(int i = 0; i < nums_len; i++){cout << nums[i] << " ";sum += nums[i];}average = sum / nums_len;cout << "和为:" << sum << ", 均值为:" << average << endl;return 0;
}
demo2: 找出数组的最大值,最小值
// 求数组的最大值最小值int min_val = nums[0], max_val = nums[0]; //假设第一个元素为最小值/最大值,其后的元素依次和最大最小比,然后更新最大值/最小值int min_index = 0, max_index = 0;for(int i = 1; i < nums_len; i ++){if(nums[i] < min_val){min_val = nums[i];min_index = i;}if(nums[i] > max_val){max_val = nums[i];max_index = i;}}cout << "最小值为:" << min_val << ", 对应的下标为:" << min_index << endl;cout << "最大值为:" << max_val << ", 对应的下标为:" << max_index << endl;
demo3:定义一个整形数组,找出奇数/偶数元素的个数
// 定义一个整形数组,找出奇数/偶数元素的个数int odd_count = 0, even_count = 0;for(int i = 0; i < nums_len; i++){if(nums[i] % 2 == 0){even_count += 1;}else{odd_count += 1;}}cout << "偶数有:" << even_count << "个, 奇数有:" << odd_count << "个" <<endl;
demo4:查找数组中是否存在某个元素,如果存在返回元素在数组中的下标,不存在返回-1
//查找数组中是否存在某个元素,如果存在返回元素在数组中的下标,不存在返回-1int searchNum;int searchIndex = -1; //初值值是一个不可能达到的值,如果最后他还是这个不可能达到的值,那么就没找到cout << "请输出要查找的数字" << endl;cin >> searchNum;for(int i = 0; i < nums_len; i++){if (nums[i] == searchNum){searchIndex = i;break;}}if(searchIndex == -1){cout << "没有查到要找的数字" << endl;}else{cout << "要查找的数字在数组中的下标为:" << searchIndex << endl;}
2.5一维数组的排序算法
1.冒泡排序
每次相邻的元素比较,将较大或者较小的元素放着后面,依次比较,较小/较大的数字就会冒到最后面 。
int main(){// 循环输入5个整形数字,进行降序排列后输出结果int n = 5;int nums[5] = {};for(int i = 0; i < n; i++){cout << "请输入数字" << endl;cin >> nums[i];}// 选择排序法// 每次找剩下元素的最大值/最小(和老师讲的有点不一样,但实质是一样的)for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(nums[i] < nums[j]){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}}for(int i = 0; i < n; i++){cout << nums[i] << endl;}
2.选择排序
int main(){// 循环输入5个整形数字,进行降序排列后输出结果int n = 5;int nums[5] = {};for(int i = 0; i < n; i++){cout << "请输入数字" << endl;cin >> nums[i];}// 选择排序法// 每次找剩下元素的最大值/最小(和老师讲的有点不一样,但实质是一样的)for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(nums[i] < nums[j]){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}}for(int i = 0; i < n; i++){cout << nums[i] << endl;}return 0;
}
2.6 一维数组元素的删除和插入
数组的大小一旦确定了,就无法改变。
int main(){// 有序数组的插入和删除//数组的删除和插入(数组一旦定义,大小不能改变,所以本例子说的是数组的长度远大于有效存储元素的个数)double power[99];int powerCount = 0; // 当前数组中元素的个数power[powerCount++] = 45760;power[powerCount++] = 45770;power[powerCount++] = 45772;power[powerCount++] = 45773;double tmp;for(int i = 0; i < powerCount; i++){for(int j = 1; j < powerCount - i; j ++){if(power[j] < power[j-1]){tmp = power[j];power[j] = power[j-1];power[j-1] = tmp;}}}cout << "排序后的数组为:" << endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}cout << endl;}
//插入数字,插入新数字之后数组依旧有序cout << "请输入要插入的数字" << endl;double insert_power;cin >> insert_power; // 1. 放在末尾,再排序// 2. 找到第一个比插入数大的元素位置,其后的元素一次往后移动一位int insert_index = powerCount;for(int i = 0; i < powerCount; i++){if(power[i] > insert_power){cout << power[i] << insert_power;insert_index = i;break;}}for(int i = powerCount-1; i >= insert_index; i--){power[i+1] = power[i];}power[insert_index] = insert_power;powerCount+=1;cout << "插入元素后的数组为"<< endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}
// 删除元素,找到要删除的元素位置,将其后的元素往前移动一位// 没有判断相同元素double delete_power;int delete_index = -1;cout << "请输出要删除的元素" << endl;cin >> delete_power;for(int i = 0; i < powerCount; i++){if(power[i] == delete_power){delete_index = i;break;}}if(delete_index == -1){cout << "没有找到要删除的元素" << endl;}else{for(int i = delete_index; i < powerCount; i++){power[i] = power[i+1];}powerCount-=1;cout << "删除元素后的数组为"<< endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}}return 0;
//}
array
用array定义数组与原来的方式定义数组效果是一样的
#include <array>
int value1[5];
array<int 5> value2; //至少是c++11才支持
3.二维数组
3.1数组定义
datatype name[rowSize][colSize];
double score[5][3]
int prices[4][4]
3.2二维数组的动态赋值
demo:输入学生各门课程的成绩
在这里插入代码片int main(){string stu_names[] = {"刘备","关羽", "张飞"};string course_names[] = {"数学", "语文", "英语"};const int ROW = 3; // sizeof(stu_names) / sizeof(stu_names[0]) 双字名字下可以这么写,其他情况下不行const int COL = 3;double scores[ROW][COL];for(int i = 0; i < ROW; i++){for(int j = 0; j < COL; j++){cout << stu_names[i] << "的" << course_names[j] << "成绩为:";cin >> scores[i][j];}}cout << "\t";for(int i = 0; i < COL; i++){cout << course_names[i] << "\t";}cout << endl;for(int i = 0; i < ROW; i++){cout << stu_names[i] << "\t";for(int j = 0; j < COL; j++){cout << scores[i][j] << "\t";}cout << endl;}return 0;
}
数学 语文 英语
刘备 1 2 3
关羽 4 5 6
张飞 7 8 9