求乙個數列的逆序數
逆序對:數列s[1],a[2],a[3]…中的任意兩個數s[i],s[j] (is[j],那麼我們就說這兩個數構成了乙個逆序對
逆序數:乙個數列中逆序對的總數
(5,4)是乙個逆序對,同樣還有(3,2),(5,2),(4,2)等等
那麼如何求得乙個數列的逆序數呢?
方法1:乙個乙個的數
最簡單也是最容易想到的方法就是,對於數列中的每乙個數s[i],遍歷數列中的數s[j](其中j該方法的時間複雜度為o(n2),具體過程就不細說了
**如下:(poj 1804 brainman)
/*直接求逆序數o(n^2)
*///
memory time
//220k 188ms
#include
using
namespace
std;
int main(int i,intj)
return0;
}
方法2:歸併的思想
有一種排序的方法是歸併排序,歸併排序的主要思想是將整個序列分成兩部分,分別遞迴將這兩部分排好序之後,再和並為乙個有序的序列.複雜度為o(nlogn)演算法
/*借助mergesort求逆序數o(nlogn)
*///
memory time
//228k 172ms
#include
using
namespace
std;
const
int inf=1000001
;int t; //
數字序列s的逆序數
void compute_t(int* s,int top,int mid,int
end)
delete
left;
delete
right;
return;}
void mergesort(int* s,int top,int
end)
return;}
int main(void
)
return0;
}
逆序數及其求法
1.逆序數 所謂逆序數,就是指乙個序列s i 統計處於序列的每個數的比這個數大並且排在它前面的數的數目,然後對於所有數,把這個數目加起來求和就是了。比如4 3 1 2 4第乙個,所以數目為0 3的前面是4,大於3的數目為1 1的前面是4 3 大於1的數目為2 2的前面是4 3 1,大於2的數目為2 ...
逆序數的幾種求法
求乙個數列的逆序數 逆序對 數列a 1 a 2 a 3 中的任意兩個數a i a j i,如果a i a j 那麼我們就說這兩個數構成了乙個逆序對 逆序數 乙個數列中逆序對的總數 如數列3 5 4 8 2 6 9 5,4 是乙個逆序對,同樣還有 3,2 5,2 4,2 等等 那麼如何求得乙個數列的逆...
逆序數的幾種求法
求乙個數列的逆序數 逆序對 數列a 1 a 2 a 3 中的任意兩個數a i a j i,如果a i a j 那麼我們就說這兩個數構成了乙個逆序對 逆序數 乙個數列中逆序對的總數 如數列3 5 4 8 2 6 9 5,4 是乙個逆序對,同樣還有 3,2 5,2 4,2 等等 那麼如何求得乙個數列的逆...