跳到主要内容

C++ 数组算法

数组是C++中最基础的数据结构之一,而数组算法则是处理数组数据的基本方法。掌握这些算法不仅对编程新手至关重要,还为学习更复杂的数据结构和算法打下坚实基础。

什么是数组算法?

数组算法是对数组元素进行操作的一系列方法,包括但不限于:

  • 数组元素的访问与遍历
  • 数组元素的查找
  • 数组的排序
  • 数组的统计操作(如求和、求平均值)
  • 数组元素的插入与删除

数组遍历算法

遍历是最基础的数组操作,它是许多其他算法的基础。

基本遍历

cpp
#include <iostream>
using namespace std;

int main() {
int arr[5] = {10, 20, 30, 40, 50};

// 使用for循环遍历
cout << "数组元素:";
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
cout << endl;

return 0;
}

输出:

数组元素:10 20 30 40 50

使用范围for循环(C++11特性)

cpp
#include <iostream>
using namespace std;

int main() {
int arr[5] = {10, 20, 30, 40, 50};

// 使用范围for循环遍历
cout << "数组元素:";
for (int x : arr) {
cout << x << " ";
}
cout << endl;

return 0;
}

输出:

数组元素:10 20 30 40 50
提示

范围for循环是C++11引入的特性,它使得数组和容器的遍历更加简洁和易读。

数组查找算法

线性查找

线性查找(Linear Search)是最简单的查找算法,适用于任何数组。

cpp
#include <iostream>
using namespace std;

int linearSearch(int arr[], int size, int key) {
for (int i = 0; i < size; i++) {
if (arr[i] == key) {
return i; // 返回找到元素的索引
}
}
return -1; // 没有找到目标元素
}

int main() {
int arr[5] = {10, 20, 30, 40, 50};
int key = 30;
int result = linearSearch(arr, 5, key);

if (result != -1) {
cout << "元素 " << key << " 在数组中的索引位置为: " << result << endl;
} else {
cout << "元素 " << key << " 不存在于数组中" << endl;
}

return 0;
}

输出:

元素 30 在数组中的索引位置为: 2

二分查找

二分查找(Binary Search)是一种高效的查找算法,但要求数组必须已经排序。

cpp
#include <iostream>
using namespace std;

int binarySearch(int arr[], int low, int high, int key) {
while (low <= high) {
int mid = low + (high - low) / 2;

// 如果找到了元素
if (arr[mid] == key) {
return mid;
}

// 如果元素比中间值大,搜索右半部分
if (arr[mid] < key) {
low = mid + 1;
}
// 否则,搜索左半部分
else {
high = mid - 1;
}
}

// 如果没找到元素
return -1;
}

int main() {
int arr[5] = {10, 20, 30, 40, 50}; // 已排序数组
int key = 40;
int result = binarySearch(arr, 0, 4, key);

if (result != -1) {
cout << "元素 " << key << " 在数组中的索引位置为: " << result << endl;
} else {
cout << "元素 " << key << " 不存在于数组中" << endl;
}

return 0;
}

输出:

元素 40 在数组中的索引位置为: 3
警告

二分查找要求数组已经排序,否则结果将不准确!

数组排序算法

冒泡排序

冒泡排序是最简单的排序算法之一,它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就交换它们。

cpp
#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]) {
// 交换相邻元素
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}

int main() {
int arr[5] = {64, 34, 25, 12, 22};

cout << "排序前的数组: ";
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

bubbleSort(arr, 5);

cout << "\n排序后的数组: ";
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

return 0;
}

输出:

排序前的数组: 64 34 25 12 22 
排序后的数组: 12 22 25 34 64

选择排序

选择排序是一种简单直观的排序算法,它每次从待排序的数据中选出最小(或最大)的元素,放在已排序序列的末尾。

cpp
#include <iostream>
using namespace std;

void selectionSort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
// 找出从i到n-1位置中值最小的元素
int min_idx = i;
for (int j = i+1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}

// 将找到的最小元素与当前位置交换
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}

int main() {
int arr[5] = {64, 34, 25, 12, 22};

cout << "排序前的数组: ";
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

selectionSort(arr, 5);

cout << "\n排序后的数组: ";
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

return 0;
}

输出:

排序前的数组: 64 34 25 12 22 
排序后的数组: 12 22 25 34 64

使用C++标准库算法

C++标准库提供了许多常用的算法,包括排序,它们通常比我们自己编写的算法更加高效。

cpp
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
int arr[5] = {64, 34, 25, 12, 22};

cout << "排序前的数组: ";
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

// 使用标准库的sort函数
sort(arr, arr + 5);

cout << "\n排序后的数组: ";
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

return 0;
}

输出:

排序前的数组: 64 34 25 12 22 
排序后的数组: 12 22 25 34 64

数组统计算法

计算数组元素之和

cpp
#include <iostream>
using namespace std;

int sumArray(int arr[], int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
return sum;
}

int main() {
int arr[5] = {10, 20, 30, 40, 50};
int sum = sumArray(arr, 5);

cout << "数组元素之和: " << sum << endl;

return 0;
}

输出:

数组元素之和: 150

找出数组中的最大值和最小值

cpp
#include <iostream>
using namespace std;

int findMax(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}

int findMin(int arr[], int n) {
int min = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}

int main() {
int arr[5] = {64, 34, 25, 12, 22};

cout << "数组中的最大值: " << findMax(arr, 5) << endl;
cout << "数组中的最小值: " << findMin(arr, 5) << endl;

return 0;
}

输出:

数组中的最大值: 64
数组中的最小值: 12

使用C++标准库进行统计

cpp
#include <iostream>
#include <algorithm>
#include <numeric> // 用于accumulate
using namespace std;

int main() {
int arr[5] = {64, 34, 25, 12, 22};

// 使用标准库计算总和
int sum = accumulate(arr, arr + 5, 0);

// 使用标准库找最大值和最小值
int max_val = *max_element(arr, arr + 5);
int min_val = *min_element(arr, arr + 5);

cout << "数组元素之和: " << sum << endl;
cout << "数组中的最大值: " << max_val << endl;
cout << "数组中的最小值: " << min_val << endl;

return 0;
}

输出:

数组元素之和: 157
数组中的最大值: 64
数组中的最小值: 12

实际应用场景

学生成绩管理系统

以下是一个简单的学生成绩管理系统示例,它使用数组存储学生成绩,并实现了基本的统计分析功能:

cpp
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;

int main() {
const int STUDENT_COUNT = 5;
double scores[STUDENT_COUNT];

// 输入学生成绩
cout << "请输入" << STUDENT_COUNT << "个学生的成绩:" << endl;
for (int i = 0; i < STUDENT_COUNT; i++) {
cout << "学生 " << (i + 1) << " 的成绩: ";
cin >> scores[i];
}

// 计算平均分
double sum = accumulate(scores, scores + STUDENT_COUNT, 0.0);
double average = sum / STUDENT_COUNT;

// 找出最高分和最低分
double highest = *max_element(scores, scores + STUDENT_COUNT);
double lowest = *min_element(scores, scores + STUDENT_COUNT);

// 对成绩排序
sort(scores, scores + STUDENT_COUNT);

// 输出统计结果
cout << "\n成绩统计:" << endl;
cout << "平均分: " << average << endl;
cout << "最高分: " << highest << endl;
cout << "最低分: " << lowest << endl;

cout << "\n排序后的成绩(从低到高): ";
for (int i = 0; i < STUDENT_COUNT; i++) {
cout << scores[i] << " ";
}
cout << endl;

return 0;
}

输入示例:

请输入5个学生的成绩:
学生 1 的成绩: 85
学生 2 的成绩: 92
学生 3 的成绩: 78
学生 4 的成绩: 95
学生 5 的成绩: 88

输出示例:

成绩统计:
平均分: 87.6
最高分: 95
最低分: 78

排序后的成绩(从低到高): 78 85 88 92 95

简单的库存管理系统

cpp
#include <iostream>
#include <string>
using namespace std;

struct Product {
string name;
int quantity;
double price;
};

int main() {
const int MAX_PRODUCTS = 5;
Product inventory[MAX_PRODUCTS] = {
{"笔记本电脑", 10, 5999.99},
{"手机", 20, 2999.99},
{"耳机", 30, 299.99},
{"平板电脑", 15, 3999.99},
{"鼠标", 50, 99.99}
};

double totalValue = 0;
int lowStockCount = 0;

// 计算库存总价值和低库存产品数量
for (int i = 0; i < MAX_PRODUCTS; i++) {
totalValue += inventory[i].quantity * inventory[i].price;
if (inventory[i].quantity < 20) {
lowStockCount++;
}
}

// 显示库存信息
cout << "库存清单:" << endl;
cout << "--------------------------------------------------" << endl;
cout << "产品名称\t\t数量\t单价\t\t总价" << endl;
cout << "--------------------------------------------------" << endl;

for (int i = 0; i < MAX_PRODUCTS; i++) {
cout << inventory[i].name << "\t\t"
<< inventory[i].quantity << "\t"
<< inventory[i].price << "\t"
<< inventory[i].quantity * inventory[i].price << endl;
}

cout << "--------------------------------------------------" << endl;
cout << "库存总价值: " << totalValue << endl;
cout << "低库存产品数量 (少于20): " << lowStockCount << endl;

return 0;
}

输出:

库存清单:
--------------------------------------------------
产品名称 数量 单价 总价
--------------------------------------------------
笔记本电脑 10 5999.99 59999.9
手机 20 2999.99 59999.8
耳机 30 299.99 8999.7
平板电脑 15 3999.99 59999.9
鼠标 50 99.99 4999.5
--------------------------------------------------
库存总价值: 193999
低库存产品数量 (少于20): 2

总结

本文详细介绍了C++中常用的数组算法,包括:

  1. 遍历算法:使用for循环和范围for循环
  2. 查找算法:线性查找和二分查找
  3. 排序算法:冒泡排序和选择排序以及使用标准库函数
  4. 统计算法:求和、求最值
  5. 实际应用:展示了学生成绩管理和库存管理两个实际应用场景

通过学习这些基础的数组算法,你将能够更有效地处理各种数据问题。这些算法不仅在程序设计中非常实用,而且也是更高级算法和数据结构的基础。

练习题

为了巩固所学知识,请尝试完成以下练习:

  1. 编写一个函数,找出数组中出现频率最高的元素。
  2. 实现插入排序算法,并与冒泡排序和选择排序比较效率。
  3. 编写一个程序,判断一个数组是否为另一个数组的子集。
  4. 实现一个简单的图书管理系统,使用数组存储图书信息,并提供搜索、排序功能。
  5. 编写一个函数,将两个已排序的数组合并成一个新的已排序数组。

参考资源

掌握这些数组算法将为你的编程之旅提供坚实的基础,祝学习顺利!