柳市網(wǎng)站托管西安網(wǎng)站制作建設(shè)
以下是C++的一些經(jīng)典算法:
一、排序算法
- 冒泡排序(Bubble Sort)
- 原理:
- 它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。
- 示例代碼:
- 原理:
#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;
}
- 快速排序(Quick Sort)
- 原理:
- 它采用了分治的策略。首先選擇一個(gè)基準(zhǔn)元素,通常是數(shù)組的第一個(gè)元素。然后將數(shù)組分為兩部分,小于基準(zhǔn)的元素放在左邊,大于基準(zhǔn)的元素放在右邊。接著對(duì)左右兩部分分別進(jìn)行快速排序,直到整個(gè)數(shù)組有序。
- 示例代碼:
- 原理:
#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;
}
- 歸并排序(Merge Sort)
- 原理:
- 歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。它將一個(gè)數(shù)組分成兩個(gè)子數(shù)組,對(duì)每個(gè)子數(shù)組進(jìn)行排序,然后將排序好的子數(shù)組合并成一個(gè)最終的排序數(shù)組。
- 示例代碼:
- 原理:
#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;
}
二、搜索算法
- 線性搜索(Linear Search)
- 原理:
- 線性搜索是一種簡(jiǎn)單的搜索算法,它從數(shù)組的第一個(gè)元素開始,逐個(gè)檢查每個(gè)元素,直到找到目標(biāo)元素或者遍歷完整個(gè)數(shù)組。
- 示例代碼:
- 原理:
#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 << "元素未找到";elsestd::cout << "元素在索引 " << result << " 處找到";return 0;
}
- 二分搜索(Binary Search)
- 原理:
- 二分搜索要求數(shù)組是有序的。它首先比較目標(biāo)元素和數(shù)組中間元素的大小。如果目標(biāo)元素等于中間元素,則返回中間元素的索引。如果目標(biāo)元素小于中間元素,則在數(shù)組的左半部分繼續(xù)搜索;如果目標(biāo)元素大于中間元素,則在數(shù)組的右半部分繼續(xù)搜索。這個(gè)過程不斷重復(fù),直到找到目標(biāo)元素或者確定目標(biāo)元素不存在。
- 示例代碼:
- 原理:
#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;elser = 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 << "元素未找到";elsestd::cout << "元素在索引 " << result << " 處找到";return 0;
}
三、圖算法
- 廣度優(yōu)先搜索(Breadth - First Search,BFS)
- 原理:
- 廣度優(yōu)先搜索是一種用于遍歷或搜索圖(或樹)的算法。它從給定的起始頂點(diǎn)開始,首先訪問起始頂點(diǎn)的所有鄰接頂點(diǎn),然后再訪問這些鄰接頂點(diǎn)的鄰接頂點(diǎn),以此類推,直到遍歷完整個(gè)圖或者找到目標(biāo)頂點(diǎn)。通常使用隊(duì)列來實(shí)現(xiàn)。
- 示例代碼(以簡(jiǎn)單的圖表示為例):
- 原理:
#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;
}
編程是一場(chǎng)與自我之間的戰(zhàn)斗,也是一場(chǎng)與世界之間的戰(zhàn)斗。