各類排序方法 歸并排序 擴展練習 逆序對數量

七月挑戰一個月重刷完Y總算法基礎題,并且每道題寫詳細題解

進度:(3/106)?

歸并排序的思想也是分而治之

歸并優點:速度穩定,排序也穩定

排序也穩定(數組中有兩個一樣的值,排序之后他們的前后順序不發生變化,我們就說這個排序是穩定的)

缺點:比起快排,空間復雜度更高

使用場景:數據量巨大,尋求穩定

速度:穩定n(logn)

思想思路

第一步

找分界點(mid,中間值)

第二步

先遞歸排序兩邊

第三步

將兩個有序數組合二為一(歸并)

有序數組合并實現思路(歸并)

利用雙指針

準備三個數組和兩個指針

三個數組其中兩個是有序數組,一個是準備用來存儲的

#include<iostream>
#include<algorithm>
using namespace std;
int n,arr[10000010],sum[10000010];
void m_sort(int arr[],int l,int r){//到達邊界,退出if(l>=r)return;//找到分界點int mid=(l+r)>>1;//利用分界點分成兩個數組,遞歸兩個數組m_sort(arr,l,mid),m_sort(arr,mid+1,r);//上面遞歸結束的,一定是兩段有序數組//遍歷兩個數組,把兩個數組的值,按照歸并順序放到第三暫存個數組//這個兩個數組,其實指的是一個數組上的兩個有序區間//每次放入之前,先進行比較兩個數組里的指針指向的數//誰指向的數組元素小,先放誰進入第三個暫存數組//然后那個數組的指針指向下個元素,循環往復,直至其中一個數組遍歷完畢int i=l,j=mid+1,k=0;while(i<=mid&&j<=r){if(arr[i]<arr[j])sum[k++]=arr[i++];else sum[k++]=arr[j++];}//上面的循環只保證其中一個數組遍歷完畢//下面的兩個循環,把未遍歷完畢的那個數組剩下的元素,添加進暫存數組while(i<=mid)sum[k++]=arr[i++];while(j<=r)sum[k++]=arr[j++];//把暫存數組,放入原數組,替代原數組元素,完成對arr[l-r]的排序for(int i=l,j=0;i<=r&&j<=k; i++,j++){arr[i]=sum[j]; }
}
int main(){cin>>n;for(int i=0;i<n;i++)cin>>arr[i];m_sort(arr,0,n-1);for(int i=0;i<n;i++)cout<<arr[i]<<' ';return 0;
}

歸并排序已完成

感悟思想:歸并排序思想也是分而治之,但是和快排不同的是,快排是把大的放左邊,小的放右邊后

越遞歸,數組有序性越強,先分好再遞歸,歸并排序是先遞歸,再排序

先確定下標的中間,中位點的下標,也就是數組長度是十的話,中位點的下標就是5

然后直接就分別遞歸中位點的左邊和右邊

直到數組變成一位的時候,遞歸停止,開始回溯

回溯到數組是兩位的時候,現在的中位點左右兩邊,都是有序數組,只需要用兩個指針,各指向兩個數組

把小的,先放入新數組即可,后面同理,回溯時,中位點兩邊的數組一定都是有序數組

把兩個有序數組合并成新數組,只需要使用雙指針,把指向的數組的值較小的那個放入新數組,然后右移指針即可

直到回溯完畢,最后一次合并,原來的無序數組就排好了

有人叫回溯是回歸,回歸+合并,歸并排序。

經典題:逆序對的數量

題目

活動 - AcWing

思路

用分治的思想,mid將數組分成=兩段

則逆序對只有三種可能:

紅色,同時在左半邊,綠色,同時在右半邊,黃色,一半在左一半在右

我們先解決黃色情況

假設數組a[n],數組b[n]都是兩個有序數組,且a[n]就是mid前0到mid的子串,b[n]是mid后mid+1到r的子串

使用雙指針算法,i,j分別指向數組第一個元素

a[i]和b[j]逐位比較

一旦b[j]小于a[i]中一個數,那說明,i到mid所有數,都和b[j]組成逆序對

因為a[]數組有序,a[i]到a[mid]的數必大于a[i],也就必大于b[j],也就必和b[j]組成逆序對

那我們只需要在兩者歸并排序時,累加記錄res+=mid-i+1;

res便是這兩個有序數組里的逆序對個數

(mid就是a[n]的長度,-i是減去已經指向過的數,+1是因為i從0開始)

黃色情況可以解決了,那只需要把所有情況都遞歸分割成黃色情況,所有情況都解決了

結論,只需要在歸并排序時,累加記錄arr[j]放在arr[i]前的情況時mid-(i+1)的值

代碼

這里只對改動部分注釋,看歸并排序點這歸并排序

#include<iostream>
using namespace std;
//數可能很大,使用long long
typedef long long ll;
int a[100010],s[100010];
ll add(int a[],int l,int r){if(l>=r)return 0;int mid=l+r>>1;//res接收值ll res=add(a,l,mid);//第二段的加上第一段的res+=add(a,mid+1,r);int k=0,i=l,j=mid+1;while(i<=mid&&j<=r){if(a[i]<=a[j])s[k++]=a[i++];else{//一旦a[j]需要放在a[i]前面//說明a[j]和a[i]以及a[i]到a[mid]所有數,都組成逆序對//mid-(i+1)的結果,就是a[i]到a[mid]的數的個數(+1是因為i從0開始)//每次出現這個時,把這個結果累加即可res+=mid-i+1;s[k++]=a[j++];}}while(i<=mid)s[k++]=a[i++];while(j<=r)s[k++]=a[j++];for(int i=0,j=l;j<=r;j++,i++){a[j]=s[i];}//處理完這段l-r,把res結果返回出去,處理下一段l-rreturn res;
}
int main(){int n;cin>>n;for(int i=0;i<n;i++){cin>>a[i];}ll res=add(a,0,n-1);cout<<res<<endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38881.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Leetcode 2065. 最大化一張圖中的路徑價值(DFS / 最短路)

Leetcode 2065. 最大化一張圖中的路徑價值 暴力DFS 容易想到&#xff0c;從0點出發DFS&#xff0c;期間維護已經走過的距離&#xff08;時間&#xff09;和途徑點的權值之和&#xff0c;若訪問到0點則更新答案&#xff0c;若下一步的距離與已走過的距離和超出了maxTime&#…

oracle sql語句 排序 fjd = ‘0101‘ 排在 fjd = ‘0103‘ 的前面

要實現這個排序需求&#xff0c;你可以使用 CASE 表達式來自定義排序邏輯。假設你有一個表格名為 your_table&#xff0c;并且有一個字段 fjd 存儲類似 ‘0101’, ‘0103’ 這樣的值&#xff0c;你可以這樣編寫 SQL 查詢&#xff1a; SELECT * FROM your_table ORDER BY CASE …

專題六:Spring源碼之初始化容器BeanFactory

上一篇咱們通過一個例子介紹初始化容器上下文相關內容&#xff0c;并通過兩個示例代碼看到了Spring在設計階段為我預留的擴展點&#xff0c;和我們應該如何利用這兩個擴展點在Spring初始化容器上下文階段為我們提供服務。這一篇咱們接著往下看。 老這樣子下回到refresh方法上來…

第55期:MySQL 頻繁 Crash 怎么辦?

社區王牌專欄《一問一實驗&#xff1a;AI 版》全新改版歸來&#xff0c;得到了新老讀者們的關注。其中不乏對 ChatDBA 感興趣的讀者前來咨詢&#xff0c;表達了想試用體驗 ChatDBA 的意愿&#xff0c;對此我們表示感謝 &#x1f91f;。 目前&#xff0c;ChatDBA 還在最后的準備…

MSVCR120.DLL丟失的多種修復方法,助你快速解決dll問題

在日常生活和工作中&#xff0c;電腦已經成為我們不可或缺的工具。然而&#xff0c;在使用電腦的過程中&#xff0c;我們常常會遇到一些問題&#xff0c;其中之一就是電腦運行軟件時提示找不到msvcr120.dll。如果該文件缺失或損壞&#xff0c;可能會導致依賴它的應用程序無法啟…

高優先線程

你開發的時候有么有遇到過一個問題&#xff1a;服務器的一個服務線程過幾個小時斷連一次&#xff0c;斷連之后會馬上重連這種情況。這是由于CPU負載較高,線程調度時將處理數據的線程掛起了一段時間導致的。 因此&#xff0c;我有考慮到把cpu的核心進行分散開來&#xff0c;就類…

CesiumJS【Basic】- #042 繪制紋理線(Primitive方式)

文章目錄 繪制紋理線(Primitive方式)1 目標2 代碼2.1 main.ts3 資源文件繪制紋理線(Primitive方式) 1 目標 使用Primitive方式繪制紋理線 2 代碼 2.1 main.ts var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);var

【劍指Offer系列】68-二叉樹的最近公共祖先(哈希)

思路&#xff1a;使用map存儲每個節點的父節點&#xff0c;則兩個節點的最近公共祖先&#xff0c;即二者的最近父節點 1、中序遍歷二叉樹&#xff08;當前節點的下一個節點&#xff09; 2、記錄每個節點的父節點 3、列出p的族譜、q的族譜 4、尋找二者最近的祖先 class Soluti…

微信小程序畢業設計-英語互助系統項目開發實戰(附源碼+論文)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計…

PS系統教程31

調色之色階 調色與通道最基本的關系通道是記錄顏色最基本的信息有些圖片可以用通道去改變顏色信息的說明這些圖像是比較高級的PS是一款圖像合成軟件&#xff0c;在合成過程中需要處理大量素材&#xff0c;比如要用這些素材進行摳背景&#xff0c;就要用到圖層蒙版以及Alpha通道…

Qt編程技巧總結篇(2)-信號-槽-多線程(一)

文章目錄 Qt編程技巧總結篇&#xff08;2&#xff09;-信號-槽-多線程&#xff08;一&#xff09;信號與槽實例與應用 小結 Qt編程技巧總結篇&#xff08;2&#xff09;-信號-槽-多線程&#xff08;一&#xff09; 最近學習信號與槽以及多線程&#xff0c;非常有技術含量&#…

【詳解】RV1106移植opencv-mobile庫

文章目錄 前言一、燒入鏡像二、編譯項目1.創建項目文件 三、移植四、運行文件五、總結 前言 硬件&#xff1a;瑞芯微Rv1106【Luckfox Pro\Max Pico、網線一根、USB線、串口助手、攝像頭 軟件&#xff1a;ubuntu 20.4 編譯器&#xff1a;arm-rockchip830-linux-uclibcgnueabihf…

人工智能——常用數學基礎之線代中的矩陣

1. 矩陣的本質&#xff1a; 矩陣本質上是一種數學結構&#xff0c;它由按照特定規則排列的數字組成&#xff0c;通常被表示為一個二維數組。矩陣可以用于描述一組數據&#xff0c;或者表示某種關系&#xff0c;比如線性變換。 在人工智能中&#xff0c;矩陣常被用來表示數據集…

【單片機與嵌入式】stm32串口通信入門

一、串口通信/協議 &#xff08;一&#xff09;串口通信簡介 串口通信是一種通過串行傳輸方式在電子設備之間進行數據交換的通信方式。它通常涉及兩條線&#xff08;一條用于發送數據&#xff0c;一條用于接收數據&#xff09;&#xff0c;適用于各種設備&#xff0c;從微控制…

Spring中利用重載與靜態分派

Spring中利用重載與靜態分派 在Java和Spring框架中&#xff0c;重載&#xff08;Overloading&#xff09;和靜態分派&#xff08;Static Dispatch&#xff09;是兩個非常重要的概念&#xff0c;它們在處理類方法選擇和執行過程中扮演著關鍵角色。本文旨在深入探討Spring環境下…

入選頂會ICML,清華AIR等聯合發布蛋白質語言模型ESM-AA,超越傳統SOTA

作為細胞內無數生化反應的驅動力&#xff0c;蛋白質在細胞微觀世界中扮演著建筑師和工程師的角色&#xff0c;不僅催化著生命活動&#xff0c;更是構筑、維系生物體形態與功能的基礎構件。正是蛋白質之間的互動、協同作用&#xff0c;支撐起了生命的宏偉藍圖。 然而&#xff0…

Ubuntu DNS服務配置 深度解析

測試方法 resolvectl status dig alidns.com 修改實踐 直接用接口配置&#xff0c;沒用 /etc/resolv.conf&#xff0c;有效 /etc/netplan/01-network-manager-all.yaml,無效 /etc/systemd/resolved.conf&#xff0c;見link&#xff0c;為全局配置 [Resolve] DNS1.1.1.1 Fa…

Adobe Premiere 視頻編輯軟件下載安裝,pr全系列分享 輕松編輯視頻

Adobe Premiere&#xff0c;自其誕生之日起&#xff0c;便以其卓越的性能和出色的表現&#xff0c;穩坐視頻編輯領域的王者寶座&#xff0c;贏得了無數專業編輯人員與廣大愛好者的青睞。這款強大的視頻編輯軟件&#xff0c;憑借其豐富的功能和靈活的操作性&#xff0c;為用戶提…

2024年道路運輸安全員(企業管理人員)備考題庫資料。

46.危險貨物道路運輸隨車攜帶的單據&#xff0c;下列選項不屬于的是&#xff08;&#xff09;。 A.道路運輸危險貨物安全卡 B.運單或者電子運單 C.道路危險貨物運輸從業資格證 D.車輛檢測報告 答案&#xff1a;D 47.危險貨物運輸駕駛人員在24小時內實際駕駛車輛時間累計不…

ROS2在rviz2中實時顯示軌跡和點

本文是將《ROS在rviz中實時顯示軌跡和點》博客中rviz軌跡顯示轉為ROS2環境中的rviz2顯示。 ros2的工作空間創建這里就不展示了。 包的創建 ros2 pkg create --build-type ament_cmake showpath --dependencies rclcpp nav_msgs geometry_msgs tf2_geometry_msgsshowpath.cpp…