通过C或C++编程语言实现某一个或多个具体算法
1. 排序算法(例如快速排序)
快速排序是一个常见的排序算法,其平均时间复杂度为 O(n log n)。
快速排序的 C++ 实现:
cpp
#include <iostream>
using namespace std;
// 快速排序算法
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivot = arr[high]; // 选择最后一个元素作为 pivot
int i = low - 1; // i 是分区的边界
for (int j = low; j < high; j++) {
if (arr[j] < pivot) { // 如果当前元素小于 pivot
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], arr[high]); // 将 pivot 放到正确的位置
int pi = i + 1; // pivot 的位置
// 递归调用快速排序,分别对左半部分和右半部分进行排序
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
int arr[] = {10, 80, 30, 90, 40, 50, 70};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "原始数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
quickSort(arr, 0, n - 1);
cout << "排序后的数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
2. 二分查找算法
二分查找是一个效率较高的查找算法,其时间复杂度为 O(log n),适用于已排序数组。
二分查找的 C++ 实现:
cpp
#include <iostream>
using namespace std;
// 二分查找
int binarySearch(int arr[], int n, int target) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2; // 计算中间位置
// 如果目标值等于中间元素,返回其位置
if (arr[mid] == target)
return mid;
// 如果目标值小于中间元素,忽略右半部分
if (arr[mid] > target)
right = mid - 1;
// 如果目标值大于中间元素,忽略左半部分
else
left = mid + 1;
}
return -1; // 如果没找到目标值,返回 -1
}
int main() {
int arr[] = {1, 3, 5, 7, 9, 11, 13, 15};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 7;
int result = binarySearch(arr, n, target);
if (result != -1)
cout << "元素 " << target << " 在索引 " << result << " 处找到" << endl;
else
cout << "元素 " << target << " 未找到" << endl;
return 0;
}
3. 最大子数组和(动态规划)
最大子数组和是经典的动态规划问题,通常使用 Kadane 算法解决。
最大子数组和的 C++ 实现:
cpp
#include <iostream>
#include <climits>
using namespace std;
// 动态规划求最大子数组和
int maxSubArraySum(int arr[], int n) {
int max_so_far = INT_MIN;
int max_ending_here = 0;
for (int i = 0; i < n; i++) {
max_ending_here += arr[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
int main() {
int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "最大子数组和是: " << maxSubArraySum(arr, n) << endl;
return 0;
}
4. 深度优先搜索(DFS)
深度优先搜索是图遍历中的一种算法,适用于图的遍历和搜索问题。
深度优先搜索(DFS)的 C++ 实现:
cpp
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
void DFS(int start, vector<vector<int>>& adjList, vector<bool>& visited) {
stack<int> s;
s.push(start);
visited[start] = true;
while (!s.empty()) {
int node = s.top();
s.pop();
cout << node << " ";
for (int neighbor : adjList[node]) {
if (!visited[neighbor]) {
s.push(neighbor);
visited[neighbor] = true;
}
}
}
}
int main() {
int n = 5; // 图的节点数
vector<vector<int>> adjList(n);
// 构造无向图的邻接表
adjList[0] = {1, 2};
adjList[1] = {0, 3};
adjList[2] = {0, 4};
adjList[3] = {1};
adjList[4] = {2};
vector<bool> visited(n, false);
cout << "深度优先搜索结果: ";
DFS(0, adjList, visited);
cout << endl;
return 0;
}