第6章 数组与字符串 关键点总结
写在最前,笔者是纯小白,记录于此是为了自己更好的记忆,希望大家多多担待错误啥的 respect!
壹 一维数组
- 定义:尽量别用变量
- 初始化:位赋值元素缺省为0
- 初始化列表:buhui
- 访问:主流是下标访问,目前就老实用这个就行了
注意点:
1.下标访问别越界
2.数组名别赋值
3.数组之间别赋值
4.两数组名别用关系运算符
5.别整花活,小白平平淡淡才是真 - 基于范围for循环
挺好用,就是不知道机考能过不
基操简单,注意&Y可以改变数组元素,y不能
其他的buhui,有兴趣自己了解 - 应用
1.多项式计算 更高效
for循环遍历 不严谨例子 图一乐 非重点 理解逻辑即可
double a[2]={1,2};
y=a[0];
cin>>x;
for(int i=0;i<2;i++)
y=y*x+a[i+1];
2.选择排序 (重点)
最基本
逻辑实现 遍历第一趟数组,找出数组的最小值,与第一个数据交换
下面是按升序重新排列数组
void selectSort2(int data[], int n) {
int i, j, temp;
for(i =0; i <n ﹣1; i++ ) //两两组合
for(j =i+1; j<n; j++ )
if(data[i] >data[j]){ //检查条件
temp = data[i] //交换两个元素
data[i]=data[j]
data[j]=temp;
}
}
运用
输入任意十个整数,按降序排序,再输入一个整数插入至上述数列,使数列保持降序。
// 在升序数组中插入元素并保持升序
void insertAndSort(int arr[], int& size, int num) {
int i = size - 1;
// 在找到合适位置之前,将大于待插入数的元素向右移动一个位置
while (i >= 0 && arr[i] > num) {
arr[i + 1] = arr[i];
i--;
}
// 插入新元素
arr[i + 1] = num;
size++; // 更新数组大小
}
- 在排好序的数列后再引用这个函数就好,前提是原数组大小可以多容纳最少一个数
- 冒泡排序(重点)
void bubbleSort (int data[ ], int n){
int i, j, temp;
for (i = 0; i < n -1; i++ ) //外层循环控制总轮次
for(j = 0; j < n-1-i; j++) //内层循环控制比较次数
if(data[j] > data[j +1]){ //是否需要相邻交换
temp =data[j];
data[j] = data[j +1];
data[j +1] = temp;
4.二分查找
要讲二分查找,我们先从顺序查找开始
#include <iostream>
// 顺序查找函数
int linearSearch(int arr[], int size, int target) {
for (int i = 0; i < size; ++i) {
if (arr[i] == target) {
return i; // 返回找到的元素索引
}
}
return -1; // 如果未找到,返回 -1
}
int main() {
int nums[] = {2, 5, 9, 13, 25, 4, 7}; // 数组
int size = sizeof(nums) / sizeof(nums[0]); // 数组大小
int target = 13; // 要查找的目标元素
int foundIndex = linearSearch(nums, size, target);
if (foundIndex != -1) {
std::cout << "Element found at index: " << foundIndex << std::endl;
} else {
std::cout << "Element not found in the array." << std::endl;
}
return 0;
}
二分查找
int searchBy(int data[], int n, int x)
int low=0;
int high =n -1;
int binary= (low + high) / 2; //确定折半位置
while(x!= data[binary] && low <= high){ //循环条件控制
if (x < data[binary])
high =binary - 1; //在前半区间查找
else
low = binary +1; //在后半区间查找
binary = (low + high) / 2;
}
if (low<= high)
return binary;
else
return -1;
- 调用标准算法
- sort函数
std::sort 函数是 C++ 标准库 头文件中提供的排序函数,它使用的是快速排序(Quicksort)或其它有效的排序算法。这个函数非常灵活,并且可以用于各种不同类型的数据和容器。下面详细说明了 std::sort 函数的运用方法和一些重要的注意事项。
#include <iostream>
#include <algorithm>
// 自定义比较函数:按照奇偶性排序
bool compareOddEven(int a, int b) {
if (a % 2 == 0 && b % 2 == 1) {
return false; // 偶数在前,奇数在后
} else if (a % 2 == 1 && b % 2 == 0) {
return true; // 奇数在前,偶数在后
} else {
return a < b; // 同为奇数或同为偶数时按升序排列
}
}
int main() {
int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5};
int size = sizeof(arr) / sizeof(arr[0]);
// 使用自定义比较函数进行排序
std::sort(arr, arr + size, compareOddEven);
std::cout << "Sorted array based on odd-even: ";
for (int i = 0; i < size; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为 1 1 3 5 5 9 2 4 6
- find函数
当使用 std::find 函数查找数组中的特定元素时,可以通过指定数组的起始位置和结束位置来进行查找。以下是一个示例:
#include <iostream>
#include <algorithm>
int main() {
int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5};
int target = 5;
int size = sizeof(arr) / sizeof(arr[0]);
// 在数组中查找目标值
auto result = std::find(arr, arr + size, target);
if (result != arr + size) {
// 计算目标值的索引
int index = std::distance(arr, result);
std::cout << "Element " << target << " found at index: " << index << std::endl;
} else {
std::cout << "Element " << target << " not found in the array." << std::endl;
}
return 0;
}
std::distance 是 C++ 标准库 头文件中的函数,用于计算两个迭代器之间的距离(元素的个数)。它接受两个迭代器作为参数,并返回它们之间的距离,即元素个数的差值。
- generate函数
#include <iostream>
#include <algorithm>
#include <vector>
// 生成器函数:返回随机整数
int generateRandomNumber() {
return rand() % 100; // 返回 0 到 99 之间的随机整数
}
int main() {
std::vector<int> vec(10); // 创建一个大小为 10 的 vector
// 使用 generate 和生成器函数填充 vector
std::generate(vec.begin(), vec.end(), generateRandomNumber);
std::cout << "Generated vector: ";
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
- 还可以这样
void makeRandom(int data[], int n) {
srand(time(NULL) ); //取当前时间秒数作为随机数发生器种
for (int i = 0; i < n; i++ )
data[i] = rand() % 100; //填充100 以内的随机数
}
记得包含头文件ctime
和cstdlib
太多了,其他的自己找吧,sorry
贰 二维数组
- 定义:几行几列
- 初始化:可以不指定行数,但要指定列数,不可超界
- 应用:难死我了aaaaaaaa!!!!
核心思想是矩阵,行列变换 ,多找规律
1.交换行,第m行和n行
for(int i=1;i<=?;i++)
{
swap(a[m][i]=a[n][i]);
}
- 遍历输入与输出熟练
for(int i=1;i<=?;i++)
for(int j=1;j<=?;j++)
cin>>a[i][j];
- 对角线交换
找出规律,需要记忆
左上右下,列-行=1;
右上左下,行+列=定值;
输出:遍历数组+if语句判定输出! - 计算矩阵边缘元素之和
输出:遍历数组+if判断第一行,i=n行,第一列,j=m列。sum+=a[i][j]