Problem Description:

老师:“小明,写一个排序算法”;
小明:
void mysort(int a[],int n) //n为数组a的元素个数
{
int i,j;
for(j=0;j< n-1;j++)
for(i=0;i< n-1;i++)
{
if(a[i] >a[i+1])//数组元素大小按升序排列
{
swap(a[i],a[i+1]);//交换
}
}
}
老师:“好,那么,问题来了,给定一个数组,按你这个算法排序,需要的交换次数是多少?回答对了今天就可以不用滚出去。”
小明按他的这个算法试了一下,发现超时了,不想天天被老师叫滚出去,小明只好求助于你,你能帮助小明今天不用滚出去么?

Input:

输入包含多组数据(EOF),每组数据第一行是一个整数n(1<=n<=10^5),第二行有n个整数(<=10^5);

Output:

对于每组数据,输出小明排序算法的交换次数。

Sample Input:

3
1 3 2
5
5 4 3 2 1
4
1 2 3 4

Sample Output:

1
10
0
解题思路:求冒泡排序的交换次数其实就是求这个序列的逆序数,归并排序水过!
AC代码一之归并排序:
 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
typedef long long LL;
int n,a[maxn],tmp[maxn];LL ans;
void _merge(int l,int m,int r){
int i=l,j=m+,k=l;
while(i<=m&&j<=r){
if(a[i]>a[j]){tmp[k++]=a[j++];ans+=(LL)m-i+;}
else tmp[k++]=a[i++];
}
while(i<=m)tmp[k++]=a[i++];
while(j<=r)tmp[k++]=a[j++];
for(int i=l;i<=r;++i)a[i]=tmp[i];
}
void _merge_sort(int l,int r){
if(l<r){
int m=(l+r)>>;
_merge_sort(l,m);
_merge_sort(m+,r);
_merge(l,m,r);
}
}
int main(){
while(~scanf("%d",&n)){
for(int i=;i<n;++i)scanf("%d",&a[i]);
ans=;_merge_sort(,n-);
printf("%lld\n",ans);
}
return ;
}

AC代码二之树状数组:

 #include<bits/stdc++.h>
using namespace std;
const int maxn=;
typedef long long LL;
int n,val,aa[maxn],tar[maxn];
struct node{int val,id;}nod[maxn];
bool cmp(node a,node b){return a.val<b.val;}
int lowbit(int x){return x & -x;}
void update(int x,int val){
while(x<=n){aa[x]+=val;x+=lowbit(x);}
}
int getsum(int x){
int ret=;
while(x>){ret+=aa[x];x-=lowbit(x);}
return ret;
}
int main(){
while(cin>>n){
LL ans=;
memset(aa,,sizeof(aa));
for(int i=;i<=n;++i){cin>>nod[i].val;nod[i].id=i;}
sort(nod+,nod+n+,cmp);
for(int i=;i<=n;++i)tar[nod[i].id]=i;
for(int i=;i<=n;++i){update(tar[i],);ans+=i-getsum(tar[i]);}
cout<<ans<<endl;
}
return ;
}

最新文章

  1. bzoj2083【Poi2010】Intelligence test
  2. Caffe入门与应用 by GX
  3. PL/SQL Developer登入时候报ORA-12638: 身份证明检索失败的解决办法
  4. 使用UltraEdit实现从DOS文件到UNIX文件的批量转换
  5. css核心基础总结篇
  6. UIBezierPath 画线
  7. Android 在Windows上安装FFmpeg程序
  8. Java集合源码分析
  9. 第9条:覆盖equals时总要覆盖hashCode
  10. mysql tee 命令
  11. 主机管理+堡垒机系统开发:strace工具的实现原理(七)
  12. hadoop多文件输出MultipleOutputFormat和MultipleOutputs
  13. 在 Windows 上可以用 Docker 吗?
  14. Adas术语简称
  15. Weka里如何将arff文件或csv文件批量导入MySQL数据库(六)
  16. 20155321 《网络对抗》 Exp6 信息搜集与漏洞扫描
  17. Scala系统学习(五):Scala访问修辞符
  18. Git操作(提高篇)
  19. gulp-uglify的使用
  20. C#将URL中的参数转换成字典Dictionary&lt;string, string&gt;

热门文章

  1. word-spacing和letter-spacing区别
  2. 2018.03.04 晚上Atcoder比赛
  3. Heaters (codeforces 1066B)
  4. PHP基础库及扩展库安装
  5. Silverlight之我见——DataGrid数据验证
  6. 机器学习中jupyter lab的安装方法以及使用的命令
  7. 第十三节:pandas之groupby()分组
  8. C语言考试
  9. C#关键字详解第五节
  10. 关于wordclou的一些简单操作