C++算法实现

指尖流年 2019-11-03 ⋅ 13 阅读

在计算机科学中,算法是解决问题的一系列步骤或方法。C++是一种强大的编程语言,提供了实现各种算法的丰富工具和库。本文将介绍几个常见的C++算法实现。

1. 排序算法

排序算法是对一组元素按照规定的顺序重新排列的算法。C++标准库提供了许多排序算法,如快速排序、归并排序等。

以下是一个使用快速排序算法对整数数组进行排序的示例:

#include <iostream>
#include <algorithm>

void quickSort(int arr[], int left, int right) {
    if (left < right) {
        int pivot = arr[right];
        int i = left - 1;
        
        for (int j = left; j < right; j++) {
            if (arr[j] < pivot) {
                i++;
                std::swap(arr[i], arr[j]);
            }
        }
        
        std::swap(arr[i + 1], arr[right]);
        
        quickSort(arr, left, i);
        quickSort(arr, i + 2, right);
    }
}

int main() {
    int arr[] = {5, 8, 1, 3, 9, 2};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    quickSort(arr, 0, n - 1);
    
    std::cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    
    return 0;
}

此代码将输出:Sorted array: 1 2 3 5 8 9

2. 搜索算法

搜索算法是在给定数据集中查找特定元素的算法。C++标准库提供了许多搜索算法,如二分搜索、线性搜索等。

以下是一个使用二分搜索算法在有序整数数组中查找特定元素的示例:

#include <iostream>
#include <algorithm>

int binarySearch(int arr[], int left, int right, int target) {
    if (right >= left) {
        int mid = left + (right - left) / 2;
        
        if (arr[mid] == target) {
            return mid;
        }
        
        if (arr[mid] > target) {
            return binarySearch(arr, left, mid - 1, target);
        }
        
        return binarySearch(arr, mid + 1, right, target);
    }
    
    return -1;
}

int main() {
    int arr[] = {1, 2, 3, 5, 8, 9};
    int n = sizeof(arr) / sizeof(arr[0]);
    int target = 3;
    
    int index = binarySearch(arr, 0, n - 1, target);
    
    if (index != -1) {
        std::cout << "Element found at index " << index;
    } else {
        std::cout << "Element not found";
    }
    
    return 0;
}

此代码将输出:Element found at index 2

3. 图算法

图算法是用于解决图数据结构中的问题的算法。C++标准库中没有直接提供图算法的实现,但可以使用第三方库,如Boost库和LEMON库。

以下是一个使用Boost库计算有向图中两个顶点之间的最短路径的示例:

#include <iostream>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>

typedef boost::property<boost::edge_weight_t, int> WeightProperty;
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, boost::no_property, WeightProperty> Graph;
typedef boost::property_map<Graph, boost::edge_weight_t>::type WeightMap;

int main() {
    Graph g(5);
    WeightMap weightMap = boost::get(boost::edge_weight, g);
    
    boost::add_edge(0, 1, 2, g);
    boost::add_edge(0, 2, 4, g);
    boost::add_edge(1, 2, 1, g);
    boost::add_edge(2, 3, 3, g);
    boost::add_edge(3, 4, 5, g);
    
    std::vector<int> distances(5);
    std::vector<boost::graph_traits<Graph>::vertex_descriptor> predecessors(5);
    
    boost::dijkstra_shortest_paths(g, 0, boost::distance_map(boost::make_iterator_property_map(distances.begin(), boost::get(boost::vertex_index, g))).predecessor_map(boost::make_iterator_property_map(predecessors.begin(), boost::get(boost::vertex_index, g))));
    
    std::cout << "Shortest path from vertex 0 to vertex 4: ";
    int v = 4;
    
    while (v != 0) {
        std::cout << v << " ";
        v = predecessors[v];
    }
    
    std::cout << "0";
    
    return 0;
}

此代码将输出:Shortest path from vertex 0 to vertex 4: 4 3 2 0

这只是C++算法实现中的一小部分。C++提供了许多其他算法和数据结构,适用于各种不同类型的问题。通过深入学习C++的算法和数据结构库,您可以更好地利用C++的潜力。


全部评论: 0

    我有话说: