日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法设计与分析——递归与分治——归并排序

發布時間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法设计与分析——递归与分治——归并排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歸并排序采用的是一種分治的思想,如下圖,先將要排序的元素分為兩塊,每個塊又開始分裂,然后逐個按照特定順序合并,合成最后我們需要的數組。
歸并排序的復雜度:
時間復雜度:O(nlogn)
空間復雜度:O(n)
最好情況和最壞情況都是O(nlogn)
是一種穩定的排序方法,因為在合并的同時保證了如果相同大小,左邊的會先放進去

合并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。合并排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序,合并排序也叫歸并排序。

函數:
MergeSort()實現了歸并排序
Merge()函數 實現了將兩個段合并到一起
Copy()函數實現了將一個段復制到另一個段中去

#include<bits/stdc++.h> using namespace std;vector<int> vec; void copy(vector<int> &nums, vector<int> &vec, int left, int right); void Merge(vector<int> &nums, vector<int> &vec, int left, int mid, int right);void MergeSort(vector<int> &nums,int left,int right) {if(left<right){int mid = (left + right) / 2;MergeSort(nums, left, mid);MergeSort(nums, mid + 1, right);Merge(nums, vec, left, mid, right);copy(nums, vec, left, right);}}void Merge(vector<int> &nums,vector<int> &vec,int left,int mid,int right) {int i=left, j=mid+1;while (i <= mid&&j <=right){if(nums[i]<nums[j]){vec.push_back(nums[i]);i++;}else{vec.push_back(nums[j]);j++;}}while(i<=mid){vec.push_back(nums[i]);i++;}while(j<=right){vec.push_back(nums[j]);j++;} }void copy(vector<int> &nums,vector<int> &vec,int left,int right) {int i = left;int k = vec.size();for (int tempK = 0;((tempK < k)&&(i<=right));tempK++) {nums[i] = vec[tempK];i++;}vec.clear(); }int main() {vector<int> num1 = {5,4,6,3,1,2,8,7,10};cout << "before sort " << endl;for (auto a:num1) {cout << a << " ";}MergeSort(num1, 0, 8);cout << endl << "after sort " << endl;for (auto b:num1) {cout << b<< " ";}system("pause");return 0; }

總結

以上是生活随笔為你收集整理的算法设计与分析——递归与分治——归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。