中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

沈陽外貿(mào)網(wǎng)站建設(shè)寧波seo免費(fèi)優(yōu)化軟件

沈陽外貿(mào)網(wǎng)站建設(shè),寧波seo免費(fèi)優(yōu)化軟件,wordpress設(shè)置用戶訪問個(gè)數(shù)據(jù)庫,wordpress添加登錄C/C編程語言因其高效、靈活和底層的特性,被廣大開發(fā)者用于實(shí)現(xiàn)各種復(fù)雜算法。本文將通過10個(gè)具體的算法案例,詳細(xì)探討C/C在算法實(shí)現(xiàn)中的技巧和應(yīng)用。 一、冒泡排序(Bubble Sort) 冒泡排序(Bubble Sort)是一…

C/C++編程語言因其高效、靈活和底層的特性,被廣大開發(fā)者用于實(shí)現(xiàn)各種復(fù)雜算法。本文將通過10個(gè)具體的算法案例,詳細(xì)探討C/C++在算法實(shí)現(xiàn)中的技巧和應(yīng)用。

在這里插入圖片描述

一、冒泡排序(Bubble Sort)

冒泡排序(Bubble Sort)是一種簡單的排序算法。它重復(fù)地遍歷要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來。遍歷數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端。

以下是使用C++實(shí)現(xiàn)冒泡排序的代碼:

#include<iostream>
using namespace std;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]) {// swap arr[j] and arr[j+1]int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}void printArray(int arr[], int size) {for (int i=0; i < size; i++) {cout << arr[i] << " ";}cout << endl;
}int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr)/sizeof(arr[0]);bubbleSort(arr, n);cout<<"Sorted array: \n";printArray(arr, n);return 0;
}

這段代碼首先定義了一個(gè)名為bubbleSort的函數(shù),該函數(shù)接受一個(gè)整數(shù)數(shù)組和數(shù)組的長度作為輸入。在函數(shù)內(nèi)部,我們使用兩個(gè)嵌套的for循環(huán)來進(jìn)行排序。外層循環(huán)表示我們總共需要進(jìn)行的排序輪數(shù),內(nèi)層循環(huán)表示每輪排序中我們需要進(jìn)行的比較次數(shù)。如果當(dāng)前元素大于下一個(gè)元素,我們就交換這兩個(gè)元素的位置。這樣,經(jīng)過多輪排序后,最大的元素就會(huì)被"冒泡"到數(shù)組的末尾。然后,我們繼續(xù)對剩下的元素進(jìn)行同樣的操作,直到所有元素都被排序。最后,我們在main函數(shù)中調(diào)用bubbleSort函數(shù)對數(shù)組進(jìn)行排序,并打印出排序后的結(jié)果。

二、快速排序(Quick Sort)

快速排序(Quick Sort)是由C.A.R. Hoare在1960年提出的一種排序算法??焖倥判虻幕舅枷胧?#xff0c;通過一趟排序?qū)⒋庞涗浄指舫瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分記錄的關(guān)鍵字小,然后分別對這兩部分繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序。

以下是使用C++實(shí)現(xiàn)快速排序的代碼:

#include<iostream>
using namespace std;int partition(int arr[], int low, int high) {int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high - 1; j++) {if (arr[j] < pivot) {i++; swap(arr[i], arr[j]);}}swap(arr[i + 1], arr[high]);return (i + 1);
}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); }
}void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {cout << arr[i] << " ";}cout << endl;
}int main() {int arr[] = {10, 7, 8, 9, 1, 5};int n = sizeof(arr) / sizeof(arr[0]);quickSort(arr, 0, n - 1);cout << "Sorted array: \n";printArray(arr, n);return 0;
}

這段代碼首先定義了一個(gè)名為partition的函數(shù),該函數(shù)接受一個(gè)整數(shù)數(shù)組以及兩個(gè)索引(low和high)作為輸入。這個(gè)函數(shù)的主要目的是選取一個(gè)基準(zhǔn)元素(這里我們選擇了數(shù)組的最后一個(gè)元素),然后將數(shù)組分為兩部分,一部分的元素都小于基準(zhǔn)元素,另一部分的元素都大于基準(zhǔn)元素。partition函數(shù)返回的是基準(zhǔn)元素的最終位置。然后,我們定義了一個(gè)名為quickSort的函數(shù),該函數(shù)遞歸地對基準(zhǔn)元素左右兩側(cè)的子數(shù)組進(jìn)行同樣的操作,直到整個(gè)數(shù)組都被排序。最后,我們在main函數(shù)中調(diào)用quickSort函數(shù)對數(shù)組進(jìn)行排序,并打印出排序后的結(jié)果。

三、插入排序(Insertion Sort)

插入排序(Insertion Sort)是一種簡單直觀的排序算法。它的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。插入排序在實(shí)現(xiàn)上,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從后向前掃描過程中,需要反復(fù)把已排序元素逐步向后挪位,為最新元素提供插入空間。

以下是使用C++實(shí)現(xiàn)插入排序的代碼:

#include<iostream>
using namespace std;void insertionSort(int arr[], int n) {int i, key, j;for (i = 1; i < n; i++) {key = arr[i];j = i - 1;/* Move elements of arr[0..i-1], that are greater than key, to one position ahead of their current position */while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}
}void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {cout << arr[i] << " ";}cout << endl;
}int main() {int arr[] = {12, 11, 13, 5, 6};int n = sizeof(arr) / sizeof(arr[0]);insertionSort(arr, n);cout << "Sorted array: \n";printArray(arr, n);return 0;
}

這段代碼首先定義了一個(gè)名為insertionSort的函數(shù),該函數(shù)接受一個(gè)整數(shù)數(shù)組以及數(shù)組的長度作為輸入。在函數(shù)內(nèi)部,我們使用一個(gè)for循環(huán)來遍歷數(shù)組中的每個(gè)元素。對于每個(gè)元素,我們都將其保存到一個(gè)名為key的變量中,然后將其與前面已經(jīng)排序好的元素進(jìn)行比較。如果前面的元素大于key,我們就將前面的元素向后移動(dòng)一位,為key騰出位置。我們一直這樣操作,直到找到key應(yīng)該插入的位置,然后將key插入到該位置。最后,我們在main函數(shù)中調(diào)用insertionSort函數(shù)對數(shù)組進(jìn)行排序,并打印出排序后的結(jié)果。

四、選擇排序(Selection Sort)

選擇排序算法詳解

選擇排序是一種簡單且直觀的排序算法,它的基本思想是:遍歷數(shù)組,找到最小(或最大)的元素,將其放到排序序列的起始位置。然后,從剩余未排序元素中繼續(xù)尋找最小(或最大)元素,放到已排序序列的末尾。如此重復(fù),直到所有元素均排序完畢。

算法步驟

  1. 在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置。
  2. 從剩余未排序元素中繼續(xù)尋找最小(或最大)元素,然后放到已排序序列的末尾。
  3. 重復(fù)第二步,直到所有元素均排序完畢。

時(shí)間復(fù)雜度

  • 最好情況:O(n^2)
  • 最壞情況:O(n^2)
  • 平均情況:O(n^2)

空間復(fù)雜度:O(1)

穩(wěn)定性:不穩(wěn)定(考慮[3, 3, 2]這個(gè)例子,第一個(gè)3會(huì)被移動(dòng)到2的后面,從而兩個(gè)3的順序顛倒了)。

C/C++代碼實(shí)現(xiàn)

下面是一個(gè)使用C++實(shí)現(xiàn)的選擇排序的例子:

#include <iostream>
using namespace std;void selectionSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {// 找到未排序部分中的最小元素的位置int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j; // 更新最小元素的位置}}// 將找到的最小元素與第一個(gè)未排序的元素交換位置if (minIndex != i) {swap(arr[i], arr[minIndex]);}}
}int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr) / sizeof(arr[0]);selectionSort(arr, n);cout << "Sorted array: \n";for (int i = 0; i < n; i++) {cout << arr[i] << " ";}return 0;
}

在這個(gè)例子中,selectionSort函數(shù)實(shí)現(xiàn)了選擇排序算法。它接受一個(gè)整數(shù)數(shù)組和數(shù)組的長度作為輸入,并按升序?qū)?shù)組進(jìn)行排序。main函數(shù)創(chuàng)建了一個(gè)待排序的數(shù)組,并調(diào)用selectionSort函數(shù)對其進(jìn)行排序。最后,它打印出排序后的數(shù)組。

五、歸并排序(Merge Sort)

歸并排序(Merge Sort)是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為2-路歸并。

以下是使用C++實(shí)現(xiàn)歸并排序的代碼:

#include<iostream>
#include<vector>
using namespace std;void merge(vector<int>& arr, int l, int m, int r) {int i, j, k;int n1 = m - l + 1;int n2 = r - m;vector<int> L(n1), R(n2);for (i = 0; i < n1; i++)L[i] = arr[l + i];for (j = 0; j < n2; j++)R[j] = arr[m + 1 + j];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(vector<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);}
}void printArray(vector<int>& arr) {int arr_size = arr.size();for (int i = 0; i < arr_size; i++) {cout << arr[i] << " ";}cout << endl;
}int main() {vector<int> arr = {12, 11, 13, 5, 6, 7};int arr_size = arr.size();cout << "Given array is \n";printArray(arr);mergeSort(arr, 0, arr_size - 1);cout << "\nSorted array is \n";printArray(arr);return 0;
}

這段代碼首先定義了一個(gè)名為merge的函數(shù),該函數(shù)用于合并兩個(gè)已經(jīng)排序好的子數(shù)組。然后定義了一個(gè)名為mergeSort的函數(shù),該函數(shù)使用遞歸的方式將數(shù)組不斷地拆分為更小的子數(shù)組,直到每個(gè)子數(shù)組只包含一個(gè)元素,然后將這些子數(shù)組合并起來。在main函數(shù)中,我們創(chuàng)建了一個(gè)整數(shù)數(shù)組,然后調(diào)用mergeSort函數(shù)對數(shù)組進(jìn)行排序,并打印出排序后的結(jié)果。

六、堆排序(Heap Sort)

堆排序算法詳解

堆排序(Heap Sort)是一種基于二叉堆(Binary Heap)的排序算法。它利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。堆是一個(gè)近似完全二叉樹的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子節(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。

算法步驟

  1. 創(chuàng)建一個(gè)最大堆(或最小堆)。最大堆的父節(jié)點(diǎn)大于或等于其子節(jié)點(diǎn),最小堆則相反。
  2. 將堆頂元素與末尾元素互換,這樣最大元素(或最小元素)就被移到了數(shù)組末尾。
  3. 減小堆的大小,并重新調(diào)整堆結(jié)構(gòu),使其保持最大堆(或最小堆)的性質(zhì)。
  4. 重復(fù)步驟2和3,直到整個(gè)數(shù)組排序完成。

時(shí)間復(fù)雜度

  • 最好情況:O(nlogn)
  • 最壞情況:O(nlogn)
  • 平均情況:O(nlogn)

空間復(fù)雜度:O(1)

穩(wěn)定性:不穩(wěn)定(考慮[3, 3, 2]這個(gè)例子,第一個(gè)3會(huì)被移動(dòng)到2的后面,從而兩個(gè)3的順序顛倒了)。

C/C++代碼實(shí)現(xiàn)

以下是一個(gè)使用C++實(shí)現(xiàn)堆排序的例子:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;// 調(diào)整堆結(jié)構(gòu),使其保持最大堆的性質(zhì)
void maxHeapify(vector<int>& nums, int i, int heapSize) {int largest = i; // 初始化最大值為當(dāng)前節(jié)點(diǎn)iint left = 2 * i + 1; // 左子節(jié)點(diǎn)索引int right = 2 * i + 2; // 右子節(jié)點(diǎn)索引// 如果左子節(jié)點(diǎn)大于當(dāng)前最大值,則更新最大值索引if (left < heapSize && nums[left] > nums[largest]) {largest = left;}// 如果右子節(jié)點(diǎn)大于當(dāng)前最大值,則更新最大值索引if (right < heapSize && nums[right] > nums[largest]) {largest = right;}// 如果最大值不是當(dāng)前節(jié)點(diǎn)i,則交換它們的值,并遞歸調(diào)整子堆結(jié)構(gòu)if (largest != i) {swap(nums[i], nums[largest]);maxHeapify(nums, largest, heapSize);}
}// 構(gòu)建最大堆
void buildMaxHeap(vector<int>& nums) {int heapSize = nums.size();// 從最后一個(gè)非葉子節(jié)點(diǎn)開始,逐個(gè)向上調(diào)整堆結(jié)構(gòu)for (int i = heapSize / 2 - 1; i >= 0; i--) {maxHeapify(nums, i, heapSize);}
}// 堆排序函數(shù)
void heapSort(vector<int>& nums) {int heapSize = nums.size();// 構(gòu)建最大堆buildMaxHeap(nums);// 將堆頂元素與末尾元素交換,并重新調(diào)整堆結(jié)構(gòu),直到整個(gè)數(shù)組排序完成for (int i = nums.size() - 1; i > 0; i--) {swap(nums[0], nums[i]); // 將堆頂元素與末尾元素交換heapSize--; // 減小堆的大小maxHeapify(nums, 0, heapSize); // 重新調(diào)整堆結(jié)構(gòu),使其保持最大堆的性質(zhì)}
}int main() {vector<int> nums = {3, 7, 1, 9, 2, 8, 5, 6, 4}; // 待排序數(shù)組heapSort(nums); // 使用堆排序?qū)?shù)組進(jìn)行排序cout << "Sorted array: "; // 輸出排序后的數(shù)組for (int num : nums) {cout << num << " ";}cout << endl; // 換行符,使輸出更美觀return 0; // 程序正常結(jié)束,返回0作為狀態(tài)碼
}

七、二分查找(Binary Search)

二分查找算法詳解

二分查找(Binary Search)是一種在有序數(shù)組中查找特定元素的搜索算法。它的工作原理是,首先將數(shù)組的中間元素與目標(biāo)值進(jìn)行比較,如果兩者相等,則查找成功;如果目標(biāo)值小于中間元素,則在數(shù)組的左半部分繼續(xù)查找;如果目標(biāo)值大于中間元素,則在數(shù)組的右半部分繼續(xù)查找。如此重復(fù),每次都將搜索范圍縮小一半,直到找到目標(biāo)值,或者搜索范圍為空(即找不到目標(biāo)值)。

算法步驟

  1. 確定數(shù)組的中間元素的下標(biāo) mid = (left + right) / 2。
  2. 如果數(shù)組為空或 left > right,則返回 -1 或拋出異常(表示未找到目標(biāo)值)。
  3. 如果中間元素等于目標(biāo)值,則返回 mid。
  4. 如果目標(biāo)值小于中間元素,則在左半部分(left, mid - 1)繼續(xù)查找。
  5. 如果目標(biāo)值大于中間元素,則在右半部分(mid + 1, right)繼續(xù)查找。
  6. 重復(fù)步驟 1-5,直到找到目標(biāo)值或確定目標(biāo)值不存在于數(shù)組中。

時(shí)間復(fù)雜度:O(log n),其中 n 是數(shù)組的長度。

C/C++代碼實(shí)現(xiàn)

以下是使用C++實(shí)現(xiàn)二分查找算法的一個(gè)例子:

#include <iostream>
#include <vector>
using namespace std;int binarySearch(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2; // 防止溢出if (nums[mid] == target) {return mid; // 找到目標(biāo)值,返回其下標(biāo)} else if (nums[mid] < target) {left = mid + 1; // 在右半部分繼續(xù)查找} else {right = mid - 1; // 在左半部分繼續(xù)查找}}return -1; // 未找到目標(biāo)值,返回 -1
}int main() {vector<int> nums = {1, 3, 5, 7, 9}; // 有序數(shù)組int target = 5; // 要查找的目標(biāo)值int result = binarySearch(nums, target); // 調(diào)用二分查找函數(shù)if (result != -1) {cout << "Target found at index: " << result << endl; // 輸出找到目標(biāo)值的下標(biāo)} else {cout << "Target not found in the array." << endl; // 輸出未找到目標(biāo)值的消息}return 0;
}

在這個(gè)例子中,我們定義了一個(gè)名為 binarySearch 的函數(shù),它接受一個(gè)有序整數(shù)數(shù)組 nums 和一個(gè)目標(biāo)值 target 作為輸入,并返回目標(biāo)值在數(shù)組中的下標(biāo)(如果找到的話),否則返回 -1。在主函數(shù) main 中,我們創(chuàng)建了一個(gè)有序數(shù)組 nums 和一個(gè)目標(biāo)值 target,然后調(diào)用 binarySearch 函數(shù)進(jìn)行查找。最后,根據(jù)函數(shù)的返回值輸出相應(yīng)的消息。

八、動(dòng)態(tài)規(guī)劃(Dynamic Programming)

動(dòng)態(tài)規(guī)劃算法詳解

動(dòng)態(tài)規(guī)劃(Dynamic Programming,簡稱DP)是一種在數(shù)學(xué)、計(jì)算機(jī)科學(xué)和經(jīng)濟(jì)學(xué)中使用的,通過把原問題分解為相對簡單的子問題的方式來求解復(fù)雜問題的方法。動(dòng)態(tài)規(guī)劃常常適用于有重疊子問題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問題。

動(dòng)態(tài)規(guī)劃的基本思想是將待求解問題分解成若干個(gè)子問題,先求解子問題,然后從這些子問題的解得到原問題的解。

基本步驟

  1. 描述問題的最優(yōu)解的結(jié)構(gòu):這一步通常是通過遞歸關(guān)系式來描述原問題的最優(yōu)解是如何由子問題的最優(yōu)解構(gòu)成的。
  2. 定義狀態(tài):這一步是定義一個(gè)或多個(gè)狀態(tài)變量來刻畫子問題的解。
  3. 狀態(tài)轉(zhuǎn)移方程:根據(jù)上一步定義的狀態(tài),寫出狀態(tài)轉(zhuǎn)移方程,描述如何從子問題的解構(gòu)造出原問題的解。
  4. 邊界條件:明確問題的邊界條件,也就是最小的子問題的解。
  5. 計(jì)算最優(yōu)解:根據(jù)狀態(tài)轉(zhuǎn)移方程和邊界條件,從最小的子問題開始,逐步計(jì)算原問題的最優(yōu)解。

舉例說明:0-1背包問題

問題描述:給定一組物品,每種物品都有自己的重量和價(jià)值,在限定的總重量內(nèi),我們?nèi)绾芜x擇,才能使得物品的總價(jià)值最大。

假設(shè)物品數(shù)量為n,每種物品i的重量為w[i],價(jià)值為v[i],背包的總?cè)萘繛閃。定義dp[i][j]為考慮前i個(gè)物品且背包容量為j時(shí)的最大價(jià)值。

狀態(tài)轉(zhuǎn)移方程為:dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]) (當(dāng)j >= w[i])

邊界條件為:dp[0][j] = 0 (0 <= j <= W) 和 dp[i][0] = 0 (0 <= i <= n)

C++代碼實(shí)現(xiàn)如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;int knapsack(int W, vector<int>& wt, vector<int>& val, int n) {vector<vector<int>> dp(n + 1, vector<int>(W + 1, 0));for (int i = 1; i <= n; i++) {for (int w = 1; w <= W; w++) {if (wt[i - 1] <= w) {dp[i][w] = max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w]);} else {dp[i][w] = dp[i - 1][w];}}}return dp[n][W];
}int main() {int W = 50; // 背包容量vector<int> wt = {10, 20, 30}; // 物品重量vector<int> val = {60, 100, 120}; // 物品價(jià)值int n = wt.size(); // 物品數(shù)量cout << "最大價(jià)值為:" << knapsack(W, wt, val, n) << endl;return 0;
}

這段代碼通過動(dòng)態(tài)規(guī)劃解決了0-1背包問題,輸出了在背包容量為50時(shí)可以獲得的最大價(jià)值。

九、深度優(yōu)先搜索(Depth-First Search, DFS)

深度優(yōu)先搜索是一種用于遍歷或搜索樹或圖的算法。這個(gè)算法會(huì)盡可能深地搜索樹的分支。當(dāng)節(jié)點(diǎn)v的所在邊都已被探尋過,搜索將回溯到發(fā)現(xiàn)節(jié)點(diǎn)v的那條邊的起始節(jié)點(diǎn)。這一過程一直進(jìn)行到已發(fā)現(xiàn)從源節(jié)點(diǎn)可達(dá)的所有節(jié)點(diǎn)為止。如果還存在未被發(fā)現(xiàn)的節(jié)點(diǎn),則選擇其中一個(gè)作為源節(jié)點(diǎn)并重復(fù)以上過程,整個(gè)進(jìn)程反復(fù)進(jìn)行直到所有節(jié)點(diǎn)都被訪問為止。

基本步驟

  1. 訪問初始節(jié)點(diǎn)v。
  2. 標(biāo)記節(jié)點(diǎn)v為已訪問。
  3. 對于v的每一個(gè)相鄰節(jié)點(diǎn)n,如果n沒有被訪問過,則遞歸地深度優(yōu)先搜索n。

適用場景
深度優(yōu)先搜索通常用于遍歷樹或圖,尋找路徑,解決迷宮問題等。

C++代碼示例:使用DFS遍歷圖

下面是一個(gè)簡單的C++代碼示例,用于通過深度優(yōu)先搜索遍歷一個(gè)圖:

#include<iostream>
#include<list>
using namespace std;class Graph {int numVertices;list<int>* adjLists;bool* visited;public:Graph(int vertices);  void addEdge(int src, int dest);void DFS(int vertex);
};Graph::Graph(int vertices) {numVertices = vertices;adjLists = new list<int>[vertices];visited = new bool[vertices];
}void Graph::addEdge(int src, int dest) {adjLists[src].push_back(dest);
}void Graph::DFS(int vertex) {visited[vertex] = true;cout << "Visited " << vertex << endl;list<int>::iterator i;for(i = adjLists[vertex].begin(); i != adjLists[vertex].end(); ++i) {if(!visited[*i]) {DFS(*i);}}
}int main() {Graph g(5);  // 創(chuàng)建一個(gè)有5個(gè)頂點(diǎn)的圖g.addEdge(0, 1);  // 添加邊 (0, 1)g.addEdge(0, 2);  // 添加邊 (0, 2)g.addEdge(1, 3);  // 添加邊 (1, 3)g.addEdge(2, 4);  // 添加邊 (2, 4)g.addEdge(3, 4);  // 添加邊 (3, 4)g.DFS(0);  // 從頂點(diǎn)0開始深度優(yōu)先搜索return 0;
}

這個(gè)代碼示例創(chuàng)建了一個(gè)有5個(gè)頂點(diǎn)的圖,并添加了一些邊。然后它從頂點(diǎn)0開始進(jìn)行深度優(yōu)先搜索,并打印出訪問的頂點(diǎn)。注意,這個(gè)示例僅用于教學(xué)目的,實(shí)際應(yīng)用中可能需要更復(fù)雜的錯(cuò)誤處理和優(yōu)化。

十、分治算法(Divide and Conquer)

分治算法(Divide and Conquer)詳解

分治算法是一種處理大型問題的有效方法。它的核心思想是將一個(gè)難以直接解決的大問題,分解成兩個(gè)或更多的規(guī)模較小的相同問題,直到最后子問題可以簡單的直接求解,然后將這些子問題的解合并得到原問題的解。

基本步驟

  1. 分解:將原問題分解為若干個(gè)規(guī)模較小,相互獨(dú)立,與原問題形式相同的子問題。
  2. 解決:若子問題規(guī)模較小而容易被解決則直接解,否則遞歸地解各個(gè)子問題。
  3. 合并:將各個(gè)子問題的解合并為原問題的解。

適用場景
分治算法可以解決的問題一般具有以下幾個(gè)特征:

  • 該問題的規(guī)模縮小到一定的程度就可以容易地解決。
  • 該問題可以分解為若干個(gè)規(guī)模較小的相同問題,即該問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。
  • 利用該問題分解出的子問題的解可以合并為該問題的解;
  • 該問題所分解出的各個(gè)子問題是相互獨(dú)立的,即子問題之間不包含公共的子問題。

C++代碼示例:歸并排序

歸并排序是分治算法的典型應(yīng)用。其基本原理是將兩個(gè)(或更多)已排序的數(shù)據(jù)序列合并成一個(gè)新的有序序列。

以下是使用C++實(shí)現(xiàn)歸并排序的代碼:

#include<iostream>
#include<vector>
using namespace std;void merge(vector<int>& arr, int l, int m, int r) {int i, j, k;int n1 = m - l + 1;int n2 = r - m;// 創(chuàng)建臨時(shí)數(shù)組vector<int> L(n1), R(n2);// 拷貝數(shù)據(jù)到臨時(shí)數(shù)組 L[] 和 R[]for (i = 0; i < n1; i++)L[i] = arr[l + i];for (j = 0; j < n2; j++)R[j] = arr[m + 1 + j];// 合并臨時(shí)數(shù)組到 arr[l..r]i = 0; // 初始化第一個(gè)子數(shù)組的索引j = 0; // 初始化第二個(gè)子數(shù)組的索引k = l; // 初始化合并子數(shù)組的索引while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}// 將 L[] 的剩余元素復(fù)制到 arrwhile (i < n1) {arr[k] = L[i];i++;k++;}// 將 R[] 的剩余元素復(fù)制到 arrwhile (j < n2) {arr[k] = R[j];j++;k++;}
}void mergeSort(vector<int>& arr, int l, int r) {if (l < r) {// 找到中間點(diǎn),將數(shù)組一分為二進(jìn)行遞歸排序,然后合并結(jié)果。int m = l + (r - l) / 2;// 分治遞歸進(jìn)行排序并合并結(jié)果。mergeSort(arr, l, m);mergeSort(arr, m + 1, r);merge(arr, l, m, r); //合并結(jié)果。																																																	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       > 對于每個(gè)數(shù)組段,先排序然后合并,這就實(shí)現(xiàn)了歸并排序。這也是典型的分治策略應(yīng)用。將大問題劃分為小問題來解決,然后將結(jié)果合并起來解決整個(gè)問題。在歸并排序中,我們將數(shù)組分成兩半,對每一半進(jìn)行排序,然后將兩個(gè)排序好的數(shù)組合并成一個(gè)大的有序數(shù)組。這個(gè)過程一直遞歸進(jìn)行下去,直到我們得到一個(gè)完全有序的數(shù)組。遞歸發(fā)生在“mergeSort()”函數(shù)中,而“merge()”函數(shù)是用來合并兩個(gè)已經(jīng)排序好的數(shù)組段。在上面的代碼中,“mergeSort()”函數(shù)遞歸地將數(shù)組分割成更小的數(shù)組,直到數(shù)組的大小為1(這意味著它已經(jīng)排序好了)。然后“merge()”函數(shù)被調(diào)用來將這些小數(shù)組兩兩合并成更大的有序數(shù)組。這個(gè)過程一直進(jìn)行下去,直到我們得到原始數(shù)組的一個(gè)完全有序的版本。在這個(gè)實(shí)現(xiàn)中,“merge()”函數(shù)用了一個(gè)非常簡單的技巧來避免額外的空間復(fù)雜度——它使用了兩個(gè)臨時(shí)的數(shù)組L和R來存儲(chǔ)分割的數(shù)組段,然后將它們合并回原始數(shù)組中。這意味著歸并排序的空間復(fù)雜度是O(n),其中n是輸入數(shù)組的大小。這是因?yàn)樵谌魏螘r(shí)候,我們都需要有足夠的空間來存儲(chǔ)原始數(shù)組的兩個(gè)分割段??偟膩碚f,歸并排序是一個(gè)非常有效且易于理解的排序算法,它的時(shí)間復(fù)雜度是O(n log n),其中n是輸入數(shù)組的大小。雖然它的空間復(fù)雜度比一些其他排序算法高(例如堆排序和快速排序),但是在許多情況下,它的穩(wěn)定性和簡單性使得它成為了一個(gè)非常實(shí)用的選擇。此外,由于它的并行性(即它可以很容易地分解成獨(dú)立的子任務(wù)),它在某些應(yīng)用中(例如多核處理器或多線程環(huán)境中)可能會(huì)比其他排序算法更加高效。所以歸并排序是分治算法的一個(gè)很好的例子,展示了如何將一個(gè)大問題分解成小問題來解決,然后將結(jié)果合并起來解決整個(gè)問題。它也是一個(gè)在實(shí)踐中廣泛使用的算法,特別是在需要處理大量數(shù)據(jù)的情況下。它的時(shí)間復(fù)雜度和空間復(fù)雜度都是可預(yù)測的,并且它的穩(wěn)定性和簡單性使得它在許多情況下都是一個(gè)非常實(shí)用的選擇。最后,需要注意的是,雖然歸并排序在理論上是一個(gè)非常優(yōu)秀的算法,但是在實(shí)際應(yīng)用中,它的性能可能會(huì)受到一些因素的影響,例如數(shù)據(jù)的分布、內(nèi)存訪問模式等。因此,在選擇使用哪種排序算法時(shí),需要綜合考慮這些因素以及具體的應(yīng)用場景和需求。以上代碼就是使用C++實(shí)現(xiàn)歸并排序的示例代碼,并且包含了對于分治策略應(yīng)用的詳細(xì)解釋和代碼注釋說明。" << endl; // 輸出提示信息以幫助理解代碼運(yùn)行過程
}
int main() {
vector<int> arr = {12, 11, 13, 5, 6, 7};
int arr_size = arr.size();
cout << "給定的數(shù)組是:\n";
for (int i = 0; i < arr_size; i++) {
cout << arr[i] << " ";} cout << "\n\n";
mergeSort(arr, 0, arr_size - 1);
cout << "排序后的數(shù)組是:\n";
for (int i = 0; i < arr_size; i++) {
cout << arr[i] << " ";} cout << endl;
return 0;
} //主函數(shù)結(jié)束
http://www.risenshineclean.com/news/36354.html

相關(guān)文章:

  • 做網(wǎng)站和程序員哪個(gè)好點(diǎn)電商運(yùn)營培訓(xùn)班多少錢
  • 做網(wǎng)站需要獨(dú)立顯卡嗎成都網(wǎng)多多
  • 手機(jī)上如何做網(wǎng)站湖南靠譜seo優(yōu)化
  • 建筑招聘網(wǎng)站哪個(gè)好網(wǎng)站建設(shè)排名優(yōu)化
  • 網(wǎng)站建設(shè)待遇怎樣長尾關(guān)鍵詞挖掘熊貓
  • 手機(jī)網(wǎng)站模板免費(fèi)電子商務(wù)網(wǎng)站建設(shè)多少錢
  • 住房和城鄉(xiāng)建設(shè)部網(wǎng)站證書查詢百度服務(wù)商
  • 上海 有哪些做網(wǎng)站的公司好想做游戲推廣怎么找游戲公司
  • 免費(fèi)一級域名網(wǎng)站西安百度框架戶
  • 職業(yè)生涯規(guī)劃大賽的意義短視頻seo系統(tǒng)
  • 給別人建網(wǎng)站工作行嗎廣告開戶
  • 網(wǎng)站建設(shè)維護(hù)及使用管理辦法深圳seo優(yōu)化公司哪家好
  • 南陽政府做網(wǎng)站推廣嗎網(wǎng)站推廣策劃報(bào)告
  • b2c網(wǎng)站建設(shè) 模板搜索引擎關(guān)鍵詞優(yōu)化方案
  • 發(fā)布培訓(xùn)的免費(fèi)網(wǎng)站模板產(chǎn)品網(wǎng)絡(luò)推廣的方法
  • 做網(wǎng)站被騙了怎么辦搭建網(wǎng)站工具
  • 蕪湖市建設(shè)工程質(zhì)量監(jiān)督站網(wǎng)站百度推廣的方式有哪些
  • 個(gè)體戶 做網(wǎng)站個(gè)人網(wǎng)頁生成器
  • 濰坊做網(wǎng)站建設(shè)站長seo工具
  • 圖片展示 網(wǎng)站線上平臺(tái)推廣方案
  • 中國建設(shè)網(wǎng)站用戶名上海專業(yè)的seo公司
  • 無錫高端網(wǎng)站建設(shè)咨詢磁力王
  • 網(wǎng)頁設(shè)計(jì)網(wǎng)站教程打廣告
  • 國內(nèi)最好的軟件網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化話術(shù)
  • 直銷網(wǎng)站系統(tǒng)制作價(jià)格小說引流推廣
  • 正規(guī)的微信推廣平臺(tái)網(wǎng)站結(jié)構(gòu)優(yōu)化的內(nèi)容和方法
  • 網(wǎng)站開發(fā)用什么框架合適滄州網(wǎng)站優(yōu)化公司
  • 外貿(mào)網(wǎng)站模板下載搜索引擎營銷經(jīng)典案例
  • 網(wǎng)站出現(xiàn)風(fēng)險(xiǎn)如何處理東莞企業(yè)網(wǎng)站模板建站
  • 建設(shè)網(wǎng)站需要了解什么企業(yè)網(wǎng)站優(yōu)化報(bào)告