归并排序算法 C++实现与时间复杂度(考过)恋上数据结构笔记
生活随笔
收集整理的這篇文章主要介紹了
归并排序算法 C++实现与时间复杂度(考过)恋上数据结构笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
復習梗概
歸并排序特點
歸并排序時間復雜度分析(某校知能情報考過)
戀上數據結構筆記 歸并排序與時間復雜度
這個圖可能會很有用
圖片來自:戀上數據結構結構與算法第二季-李明杰老師
歸并排序本體函數
從輸出也能大致看出來歸并排序的歸并順序,每次merge都會打印一次數組
圖片來自:戀上數據結構結構與算法第二季-李明杰老師
merge函數!!重要(兩個有序數組合并成一個有序數組)
圖片來自:戀上數據結構結構與算法第二季-李明杰老師
merge函數寫法2
這是merge函數的另一種寫法,因為寫法不是唯一的,多看看以免以后考到不會
這個是先有一個數組全部插入了就截止,然后再把另一個數組剩余的全部插入
完整代碼
#include <iostream> #include <vector> #include "MeasureAlgoTime.hpp" using namespace std;// void vectorPrint(vector<int> &array) {for (int i = 0; i < array.size(); i++){cout << array[i] << ' ';}cout << endl; }//merge函數就是將兩個有序數組合并成一個有序數組,由于歸并排序中,這兩個數組都在一個數組內,所以這里參數begin是左數組的第一位,end是右數組的最后一位 //這里的begin,mid,end都代表的是數組下標 //merge的整體思想是,兩個有序數組,兩個指針分別指向首位,指針指向的二者進行比較,小的先放入新數組,同時插入的元素對應數組指針++,另一個不變,接著比 //還是畫圖比較好理解,但這個也不難 void merge(vector<int> &array, int begin, int end) {vector<int> temp = {};//定義臨時數組,用于暫時存放合并并排序的有序數組,最后再覆蓋給arrayint mid = (begin + end) / 2;//求mid,mid是左數組的終端,mid+1是右數組的起點,這和mergeSort函數中上面兩個遞歸調用的begin與mid和end是一樣的int tempPointer = 0;int leftBeginPointer = begin;//不要想當然以為左數組起點下標一定是0,這要看你傳進來的是從哪開始的數組int rightBeginPointer = mid + 1;//這里定義了三個指針,分別指向臨時數組的下一個插入位置(vector就不需要了,就是個擺設),左數組的下一個插入元素,右數組的下一個插入元素while (tempPointer != end + 1)//當臨時數組長度已經等于右數組末尾長度(左右數組長度和),說明都插入了,結束循環{if (array[leftBeginPointer] <= array[rightBeginPointer]){temp.push_back(array[leftBeginPointer]);tempPointer++;leftBeginPointer++;}else if (array[rightBeginPointer] < array[leftBeginPointer]){temp.push_back(array[rightBeginPointer]);tempPointer++;rightBeginPointer++;}//若檢測一個數組已經全部插入,則直接把另一個數組剩余元素全部插入退出即可if (leftBeginPointer == mid + 1){while (rightBeginPointer != end + 1){temp.push_back(array[rightBeginPointer]);tempPointer++;rightBeginPointer++;}break;}else if (rightBeginPointer == end + 1){while (leftBeginPointer != mid + 1){temp.push_back(array[leftBeginPointer]);tempPointer++;leftBeginPointer++;}break;}}//用臨時數組覆蓋array對應位置的數組for (int i = 0; i < end - begin + 1; i++){array[begin + i] = temp[i];} }void merge2nd(vector<int> &array, int begin, int end) {vector<int> temp = {};//定義臨時數組,用于暫時存放合并并排序的有序數組,最后再覆蓋給arrayint mid = (begin + end) / 2;//求mid,mid是左數組的終端,mid+1是右數組的起點,這和mergeSort函數中上面兩個遞歸調用的begin與mid和end是一樣的int tempPointer = 0;int leftBeginPointer = begin;//不要想當然以為左數組起點下標一定是0,這要看你傳進來的是從哪開始的數組int rightBeginPointer = mid + 1;//這里定義了三個指針,分別指向臨時數組的下一個插入位置,左數組的下一個插入元素,右數組的下一個插入元素while(leftBeginPointer<mid+1&&rightBeginPointer<end+1){if (array[leftBeginPointer] <= array[rightBeginPointer]){temp.push_back(array[leftBeginPointer]);tempPointer++;leftBeginPointer++;}else if (array[rightBeginPointer] < array[leftBeginPointer]){temp.push_back(array[rightBeginPointer]);tempPointer++;rightBeginPointer++;}}while(leftBeginPointer<mid+1){temp.push_back(array[leftBeginPointer]);tempPointer++;leftBeginPointer++;}while(rightBeginPointer<end+1){temp.push_back(array[rightBeginPointer]);tempPointer++;rightBeginPointer++;}//用臨時數組覆蓋array對應位置的數組for (int i = 0; i < end - begin + 1; i++){array[begin + i] = temp[i];} }void mergeSort(vector<int> &array, int begin, int end) {//有點類似樹的遞歸訪問,每次調用都把當前數組一分為二,直到不可再分就return,然后merge成一個有序數組,再不斷mergeif (end - begin + 1 < 2){return;}int mid = (begin + end) / 2;mergeSort(array, begin, mid);mergeSort(array, mid+1, end);merge(array, begin, end);vectorPrint(array); }void mergeSort2nd(vector<int> &array, int begin, int end) {if (end - begin + 1 < 2){return;}int mid = (begin + end) / 2;mergeSort2nd(array, begin, mid);mergeSort2nd(array, mid+1, end);merge2nd(array, begin, end);vectorPrint(array); }int main() {Tools::Time::AlgoTimeUs time1;Tools::Time::AlgoTimeUs time2;Tools::Time::AlgoTimeUs time3;vector<int> array;array = {6, 9, 3, 1, 2, 0, 8, 29, 15, 11, 10};vector<int> array2 = array;vector<int> array3 = array;cout << "輸入數組:" << endl;vectorPrint(array);time1.start();cout << "歸并排序基礎版" << endl;mergeSort(array, 0, array.size() - 1);cout << "算法用時:(微秒)";time1.printElapsed();cout << "輸入數組:" << endl;vectorPrint(array2);time1.start();cout << "歸并排序歸并換個寫法" << endl;mergeSort(array2, 0, array2.size() - 1);cout << "算法用時:(微秒)";time1.printElapsed();return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的归并排序算法 C++实现与时间复杂度(考过)恋上数据结构笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TPO 按主题刷题记录
- 下一篇: 快速排序 C++代码实现及其算法思想及时