理论基础 —— 排序 —— 逆序对问题
生活随笔
收集整理的這篇文章主要介紹了
理论基础 —— 排序 —— 逆序对问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【概述】
設A為一個有n個數字的有序集,其中所有數字各不相同。如果存在整數i、j,使得1<=i<j<=n且A[i]>A[j],則{A[i],A[j]}這個有序對稱為A的一個逆序對。
例如:集合{3,1,4,5,2}的逆序對有{3,1}、{3,2}、{4,2}、{5,2}共4個。
而逆序對問題,即:對給定的數組序列,求其逆序對的數量。
【分析】
從定義上分析,逆序對就是數列中任意兩個數滿足大的在前,小的在后的組合。如果將這些逆序對都調整為順序,那么整個數列就變的有序,即排序。
因而容易想到冒泡排序的機制正好是利用消除逆序來實現的,也就是說,交換相鄰兩個逆序數,最終實現整個序列有序,那么交換的次數即為逆序對的數量。
但由于冒泡排序本身效率不高,時間復雜度為O(n^2),對于n較大的情況下不適用,因此我們用歸并排序來解決逆序對問題。
【程序實現】
/*只需修改原有歸并程序,當右邊序列元素為較小值時,就統計其產生的逆序對數量,即可完成逆序對統計*/ void msort(int s,int t) {if(s==t)//只有一個數字則返回return;int mid=(s+t)/2;msort(s,mid);//分解左序列msort(mid+1,t);//分解右序列int i=s,j=mid+1,k=s;while(i<=mid&&j<=t){if(a[i]<=a[j]){r[k]=a[j];k++;i++;}else{r[k]=a[j];k++;j++;ans+=mid-i+1;//統計產生逆序對的數量}}while(i<=mid){//復制左邊子序列剩余r[k]=a[i];k++;i++;}while(j<=t){//復制右邊子序列剩余r[k]=a[j];k++;j++;}for(i=s;i<=t;i++)a[i]=r[i]; }?
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的理论基础 —— 排序 —— 逆序对问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: By Recognizing These
- 下一篇: 动态规划 —— 背包问题 P08 ——