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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

一学就废的归并排序

發布時間:2023/12/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一学就废的归并排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 其他與排序有關的文章
  • 原理
  • 代碼實現
  • 復雜度分析


其他與排序有關的文章

一學就廢的三種簡單排序【冒泡、插入、選擇】


原理

歸并排序(Merge sort): 歸并排序對元素 遞歸地 進行 逐層折半分組,然后從最小分組開始,逐層進行 比較排序 + 合并成一個大的分組 。

用一張圖表示其原理:

圖源Krahets


代碼實現

void Merge(vector<int>& nums, int left, int right){// 終止條件if(left >= right) return;// 遞歸拆分int mid = (left+right)/2;Merge(nums, left, mid);Merge(nums, mid+1, right);// 合并排序vector<int> tmp(right-left+1);// 新建臨時數組用以保存排序好的元素int i = left, j = mid + 1, p = 0;while(i<=mid && j<=right){ // 升序排列if(nums[i] < nums[j]) tmp[p++] = nums[i++];else tmp[p++] = nums[j++];}// 處理剩余左\右子數組元素while(i <= mid) tmp[p++] = nums[i++];while(j <= right) tmp[p++] = nums[j++];//結果儲存for(int i=0; i<tmp.size(); i++){nums[i + left] = tmp[i];} }

可以進行優化,畢竟如果每次遞歸都新建一個tmp數組是很費時間的:

void Merge(vector<int>& nums, int left, int right, vector<int>& tmp){// 終止條件if(left >= right) return;// 遞歸拆分int mid = (left+right)/2;Merge(nums, left, mid, tmp);Merge(nums, mid+1, right, tmp);// 合并排序int i = left, j = mid + 1, p = left;while(i<=mid && j<=right){ // 升序排列if(nums[i] < nums[j]) tmp[p++] = nums[i++];else tmp[p++] = nums[j++];}// 處理剩余左\右子數組元素while(i <= mid) tmp[p++] = nums[i++];while(j <= right) tmp[p++] = nums[j++];//結果儲存for(int i=left; i<=right; i++){nums[i] = tmp[i];} }

復雜度分析

  • 時間復雜度 O(NlogN) : 其中 N 為數組長度;歸并排序使用 O(NlogN) 時間;
  • 空間復雜度 O(N): 輔助數組 tmp 占用 O(N) 大小的額外空間;

總結

以上是生活随笔為你收集整理的一学就废的归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。

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