归并排序同时计算逆序对数

来源:互联网 发布:vue删除数组中的对象 编辑:程序博客网 时间:2024/06/05 17:37

归并排序同时求逆序对数

c++11:

#include <iostream>#include <algorithm>#include <vector>#include <initializer_list>using namespace std;vector<int> v({5,4,3,2,7,6});int reverse_pairs=0;void merge(vector<int> &v, int start, int step, vector<int> &temp){const int n=v.size();int s1=start;int e1=start+step;int s2=e1;int e2= s2+step<n ? s2+step : n;int i=start;while(s1<e1&&s2<e2){if(v[s1]<=v[s2]){temp[i]=v[s1];--step;//复用step,用于计算逆序数++s1;}else{temp[i]=v[s2];reverse_pairs+=step;++s2;}++i;}if(s1<e1){copy(v.begin()+s1,v.begin()+e1,temp.begin()+i);}if(s2<e2){copy(v.begin()+s2,v.begin()+e2,temp.begin()+i);}}void msort(vector<int> &v){reverse_pairs=0;const int n=v.size();vector<int> temp(n); //临时空间int step=1;for(;step<n;step*=2){int i=0;for(;i<n-step;i+=2*step){merge(v,i,step,temp);}if(i<n)copy(v.begin()+i, v.end(), temp.begin()+i);swap(v,temp);}}int main() {for_each(v.begin(),v.end(),[&](int & x){cout<<x<<"  ";});cout<<endl<<endl;msort(v);cout<<reverse_pairs<<endl;for(int x: v){cout<<x<<"  ";}cout<<endl;}


scala (每次merge时计数)

object Main extends App {var reverse_pairs=0  //逆序数def msort[T](cmp:(T,T)=>Boolean)(l:List[T]):List[T]={def merge(l1:List[T],l2:List[T]):List[T] = (l1,l2) match{case(Nil,_) => l2case(_,Nil) => l1case(x::left1,y::left2) => if(cmp(x,y))x::merge(left1,l2)  else{reverse_pairs+=l1.length  //增加逆序数y::merge(l1,left2)}}val n=l.length/2if(n==0)return lelse{val (l1,l2)=l.splitAt(n)merge(msort(cmp)(l1),msort(cmp)(l2))}}println(msort((x:Int,y:Int)=>x<y)(List(5,4,3,2,7,6)))println(reverse_pairs)}



0 0
原创粉丝点击