当前位置: 首页 > article >正文

通过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;
}

http://www.kler.cn/a/548631.html

相关文章:

  • UIView 与 CALayer 的联系和区别
  • DeepSeek自动化写作软件
  • 网络安全清单
  • set_intersection set_union set_difference set_symmetric_difference
  • 【Qt】模型/视图(Model/View)框架详解(一):基本概念
  • easyexcel解析excel文件的时候报错
  • SpringCloud整合seata,XA、AT、TCC、SAGA模式
  • Golang关于结构体组合赋值的问题
  • 带Web界面的yt-dlp视频下载器
  • Qt在函数中更新 UI 或重新绘制图形用replot和QTimer::singleShot的区别
  • 如何有效防止TikTok多店铺入驻时IP关联问题?
  • Tortoise Git
  • 关于FSGithubPNG生成外链时描述出现路径问题
  • linux c 读写锁pthread_rwlock
  • 11. Docker 微服务实战(将项目打包生成镜像,在 Docker 当中作为容器实例运行)
  • 现在有什么赛道可以干到退休?
  • 3D打印学习
  • 53倍性能提升!TiDB 全局索引如何优化分区表查询?
  • 传感器篇(一)——深度相机
  • linux系统测试网络pps、带宽和延时(方案来源于阿里云)