NO.22 十六届蓝桥杯备战 | 一维数组 | 七道练习 | 冒泡排序 (C++)
目录
- 前言
- 一维数组基础知识
- 一维数组定义
- 一维数组的初始化
- 一维数组的遍历
- 一维数组的应用场景
- 七道练习
- 练习1:数组求和
- 练习2:数组反转
- 练习3:数组最大值和最小值
- 练习4:数组去重
- 练习5:二维数组转置
- 练习6:冒泡排序实现
- 练习7:冒泡排序优化
- 冒泡排序原理
- 冒泡排序基本原理
- 冒泡排序的时间复杂度分析
- C++中如何实现冒泡排序
- 冒泡排序的代码实现
- 冒泡排序优化后的代码实现
- 冒泡排序的应用场景
- 冒泡排序在实际场景中的应用
- 总结与提升
- 附录
- C++代码规范
- C++数组常见错误及解决方法
1. 前言
在备战蓝桥杯的过程中,掌握一维数组以及基本排序算法的实现是至关重要的。尤其是冒泡排序,这是一种非常基础且简单的排序算法,在大多数编程竞赛中都会遇到。本文将通过七道练习带领大家全面掌握一维数组的操作技巧,同时着重讲解冒泡排序的实现和优化方法。
2. 一维数组基础知识
一维数组定义
在C++中,数组是用来存储多个相同类型数据的数据结构。一维数组是最简单的数组形式,它可以用来存储一系列按顺序排列的数据。数组的元素在内存中是连续存储的。
定义一个一维数组的基本语法如下:
cppCopy Codetype array_name[size];
type
:表示数组元素的类型(如int
、float
、char
等)。array_name
:数组的名字。size
:数组的大小,表示数组中元素的个数。
示例:
cppCopy Codeint arr[5]; // 声明一个包含5个整数的数组
一维数组的初始化
在C++中,可以通过以下几种方式来初始化一维数组:
-
显式初始化: 通过大括号
{}
将数组中的元素进行初始化。cppCopy Codeint arr[5] = {1, 2, 3, 4, 5};
-
部分初始化: 如果初始化元素少于数组大小,剩余的元素会自动被初始化为零。
cppCopy Codeint arr[5] = {1, 2}; // 其余元素为0
-
隐式初始化: 如果不进行初始化,C++会为数组元素分配默认值,局部变量默认值不确定(例如垃圾值),而静态数组则会被初始化为零。
cppCopy Codeint arr[5]; // 数组元素未初始化
一维数组的遍历
遍历数组是对数组操作中最常见的需求。可以通过索引来访问数组的每个元素。
示例:
cppCopy Codeint arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; ++i) {
cout << arr[i] << " "; // 输出数组元素
}
一维数组的应用场景
一维数组常用于存储具有相同类型的数据,如成绩单、温度数据、价格数据等。在编程竞赛中,数组常用于存储输入数据并对其进行处理,比如排序、查找最大值、最小值等。
3. 七道练习
练习1:数组求和
给定一个一维数组,编写程序计算数组中所有元素的和。
思路:
通过遍历数组,将每个元素相加。
代码实现:
cppCopy Code#include <iostream>
using namespace std;
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int sum = 0;
for (int i = 0; i < 5; ++i) {
sum += arr[i]; // 累加数组元素
}
cout << "数组元素的和为:" << sum << endl;
return 0;
}
练习2:数组反转
给定一个数组,编写程序将其反转。
思路:
可以使用两个指针分别指向数组的首尾,交换两个元素,直到指针相遇。
代码实现:
cppCopy Code#include <iostream>
using namespace std;
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int left = 0, right = 4;
while (left < right) {
swap(arr[left], arr[right]);
left++;
right--;
}
cout << "反转后的数组为:";
for (int i = 0; i < 5; ++i) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
练习3:数组最大值和最小值
给定一个数组,编写程序找出其中的最大值和最小值。
思路:
通过遍历数组,记录当前最大和最小值。
代码实现:
cppCopy Code#include <iostream>
using namespace std;
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int max_val = arr[0];
int min_val = arr[0];
for (int i = 1; i < 5; ++i) {
if (arr[i] > max_val) {
max_val = arr[i];
}
if (arr[i] < min_val) {
min_val = arr[i];
}
}
cout << "最大值:" << max_val << endl;
cout << "最小值:" << min_val << endl;
return 0;
}
练习4:数组去重
给定一个数组,编写程序去除数组中的重复元素。
思路:
通过遍历数组,将不重复的元素保存到另一个数组中。
代码实现:
cppCopy Code#include <iostream>
#include <set>
using namespace std;
int main() {
int arr[8] = {1, 2, 2, 3, 4, 4, 5, 5};
set<int> unique_elements;
for (int i = 0; i < 8; ++i) {
unique_elements.insert(arr[i]);
}
cout << "去重后的数组为:";
for (int val : unique_elements) {
cout << val << " ";
}
cout << endl;
return 0;
}
练习5:二维数组转置
将一个二维数组转置为另一二维数组。
思路:
将第i
行第j
列的元素转置到第j
行第i
列。
代码实现:
cppCopy Code#include <iostream>
using namespace std;
int main() {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int transposed[3][2];
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
transposed[j][i] = arr[i][j];
}
}
cout << "转置后的数组为:" << endl;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
cout << transposed[i][j] << " ";
}
cout << endl;
}
return 0;
}
练习6:冒泡排序实现
冒泡排序是一种简单的排序算法,其原理是通过重复交换相邻的元素,将最大的元素"冒泡"到数组的末尾。
思路:
从数组的开始位置依次比较相邻的元素,如果前面的元素大于后面的元素,则交换它们的位置,直到整个数组排序完成。
代码实现:
cppCopy Code#include <iostream>
using namespace std;
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; ++i) {
for (int j = 0; j < n-i-1; ++j) {
if (arr[j] > arr[j+1]) {
swap(arr[j], arr[j+1]);
}
}
}
}
int main() {
int arr[5] = {5, 3, 8, 4, 2};
bubbleSort(arr, 5);
cout << "排序后的数组为:";
for (int i = 0; i < 5; ++i) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
练习7:冒泡排序优化
冒泡排序的时间复杂度是O(n^2),但可以通过优化来减少不必要的遍历次数。具体来说,如果在某一轮遍历中没有发生交换,说明数组已经有序,可以提前结束排序过程。
思路:
引入一个标志变量,记录某一轮是否发生了交换。如果没有交换,则提前结束排序。
代码实现:
cppCopy Code#include <iostream>
using namespace std;
void optimizedBubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; ++i) {
bool swapped = false;
for (int j = 0; j < n-i-1; ++j) {
if (arr[j] > arr[j+1]) {
swap(arr[j], arr[j+1]);
swapped = true;
}
}
if (!swapped) {
break; // 提前结束
}
}
}
int main() {
int arr[5] = {5, 3, 8, 4, 2};
optimizedBubbleSort(arr, 5);
cout << "优化后的排序数组为:";
for (int i = 0; i < 5; ++i) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
4. 冒泡排序原理
冒泡排序基本原理
冒泡排序是一种简单的排序算法,通过不断交换相邻的元素,使得每一轮遍历都能将未排序部分的最大元素"冒泡"到数组的末尾。这样经过多轮交换后,整个数组就会变得有序。
冒泡排序的时间复杂度分析
- 最坏情况:时间复杂度为O(n^2),此时数组是逆序的,需要进行最多的交换。
- 最佳情况:时间复杂度为O(n),当数组已经有序时,只需要进行一轮遍历。