C++的一些经典算法

以下是C++的一些经典算法:

一、排序算法

  1. 冒泡排序(Bubble Sort)
    • 原理
      • 它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
    • 示例代码
cpp 复制代码
#include <iostream>
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, 4, 3, 2, 1};
    int n = sizeof(arr)/sizeof(arr[0]);
    bubbleSort(arr, n);
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    return 0;
}
  1. 快速排序(Quick Sort)
    • 原理
      • 它采用了分治的策略。首先选择一个基准元素,通常是数组的第一个元素。然后将数组分为两部分,小于基准的元素放在左边,大于基准的元素放在右边。接着对左右两部分分别进行快速排序,直到整个数组有序。
    • 示例代码
cpp 复制代码
#include <iostream>
int partition(int arr[], int low, int high) {
    int pivot = arr[low];
    int i = low - 1, j = high + 1;
    while (true) {
        do {
            i++;
        } while (arr[i] < pivot);
        do {
            j--;
        } while (arr[j] > pivot);
        if (i >= j) return j;
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr[], low, high);
        quickSort(arr, low, pi);
        quickSort(arr, pi + 1, high);
    }
}
int main() {
    int arr[] = {5, 4, 3, 2, 1};
    int n = sizeof(arr)/sizeof(arr[0]);
    quickSort(arr, 0, n - 1);
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    return 0;
}
  1. 归并排序(Merge Sort)
    • 原理
      • 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。它将一个数组分成两个子数组,对每个子数组进行排序,然后将排序好的子数组合并成一个最终的排序数组。
    • 示例代码
cpp 复制代码
#include <iostream>
void merge(int arr[], int l, int m, int r) {
    int n1 = m - l + 1;
    int n2 = r - m;
    int L[n1], R[n2];
    for (int i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (int j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];
    int i = 0, j = 0, k = l;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}
void mergeSort(int arr[], int l, int r) {
    if (l < r) {
        int m = l+(r - l)/2;
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);
        merge(arr, l, m, r);
    }
}
int main() {
    int arr[] = {5, 4, 3, 2, 1};
    int n = sizeof(arr)/sizeof(arr[0]);
    mergeSort(arr, 0, n - 1);
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    return 0;
}

二、搜索算法

  1. 线性搜索(Linear Search)
    • 原理
      • 线性搜索是一种简单的搜索算法,它从数组的第一个元素开始,逐个检查每个元素,直到找到目标元素或者遍历完整个数组。
    • 示例代码
cpp 复制代码
#include <iostream>
int linearSearch(int arr[], int n, int key) {
    for (int i = 0; i < n; i++) {
        if (arr[i] == key)
            return i;
    }
    return -1;
}
int main() {
    int arr[] = {1, 3, 5, 7, 9};
    int n = sizeof(arr)/sizeof(arr[0]);
    int key = 5;
    int result = linearSearch(arr, n, key);
    if (result == -1)
        std::cout << "元素未找到";
    else
        std::cout << "元素在索引 " << result << " 处找到";
    return 0;
}
  1. 二分搜索(Binary Search)
    • 原理
      • 二分搜索要求数组是有序的。它首先比较目标元素和数组中间元素的大小。如果目标元素等于中间元素,则返回中间元素的索引。如果目标元素小于中间元素,则在数组的左半部分继续搜索;如果目标元素大于中间元素,则在数组的右半部分继续搜索。这个过程不断重复,直到找到目标元素或者确定目标元素不存在。
    • 示例代码
cpp 复制代码
#include <iostream>
int binarySearch(int arr[], int l, int r, int key) {
    while (l <= r) {
        int mid = l+(r - l)/2;
        if (arr[mid] == key)
            return mid;
        else if (arr[mid] < key)
            l = mid + 1;
        else
            r = mid - 1;
    }
    return -1;
}
int main() {
    int arr[] = {1, 3, 5, 7, 9};
    int n = sizeof(arr)/sizeof(arr[0]);
    int key = 5;
    int result = binarySearch(arr, 0, n - 1, key);
    if (result == -1)
        std::cout << "元素未找到";
    else
        std::cout << "元素在索引 " << result << " 处找到";
    return 0;
}

三、图算法

  1. 广度优先搜索(Breadth - First Search,BFS)
    • 原理
      • 广度优先搜索是一种用于遍历或搜索图(或树)的算法。它从给定的起始顶点开始,首先访问起始顶点的所有邻接顶点,然后再访问这些邻接顶点的邻接顶点,以此类推,直到遍历完整个图或者找到目标顶点。通常使用队列来实现。
    • 示例代码(以简单的图表示为例)
cpp 复制代码
#include <iostream>
#include <queue>
#include <vector>
void bfs(std::vector<std::vector<int>>& graph, int start) {
    int n = graph.size();
    std::vector<bool> visited(n, false);
    std::queue<int> q;
    visited[start] = true;
    q.push(start);
    while (!q.empty()) {
        int vertex = q.front();
        q.pop();
        std::cout << vertex << " ";
        for (int neighbor : graph[vertex]) {
            if (!visited[neighbor]) {
                visited[neighbor] = true;
                q.push(neighbor);
            }
        }
    }
}
int main() {
    std::vector<std::vector<int>> graph = {
        {1, 2},
        {0, 3, 4},
        {0, 4},
        {1},
        {1, 2}
    };
    bfs(graph, 0);
    return 0;
}

编程是一场与自我之间的战斗,也是一场与世界之间的战斗。

相关推荐
朝朝又沐沐3 小时前
算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
开发语言·数据结构·c++·算法·链表
薰衣草23334 小时前
一天两道力扣(6)
算法·leetcode
逝雪Yuki4 小时前
Leetcode——287. 寻找重复数
c++·leetcode·二分查找·双指针·环形链表
剪一朵云爱着4 小时前
力扣946. 验证栈序列
算法·
遇见尚硅谷4 小时前
C语言:*p++与p++有何区别
c语言·开发语言·笔记·学习·算法
天天开心(∩_∩)4 小时前
代码随想录算法训练营第三十二天
算法
YouQian7725 小时前
(AC)缓存系统
算法·缓存
艾莉丝努力练剑5 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
科大饭桶5 小时前
数据结构自学Day13 -- 快速排序--“前后指针法”
数据结构·算法·leetcode·排序算法·c
李永奉5 小时前
C语言-流程控制语句:for循环语句、while和do…while循环语句;
c语言·开发语言·c++·算法