归并排序求逆序对数目
来源:互联网 发布:手机淘宝么注册网店 编辑:程序博客网 时间:2024/06/01 10:08
给出一个算法,它在最坏情况下运行时间为O(nlogn),确定n个元素的任何排序中逆序对的数目。
#include <stdio.h> #include <stdlib.h> int s[1000000],r[1000000],p=0;//变量p记录逆序对数量 void merge(int s[],int f,int m,int n,int r[]) //将s中相邻两个子文件合并至r中相同位置 { int i=f,j=m+1,k=f; while(i<m+1&&j<n+1) { if(s[j]<s[i]) { r[k]=s[j]; ++j; p+=m-i+1;//逆序对增加 } else { r[k]=s[i]; ++i; } ++k; } for(; i<m+1; ++i,++k) r[k]=s[i]; for(; j<n+1; ++j,++k) r[k]=s[j]; } void mpass(int s[],int n,int len,int r[])//一趟合并 { int i=0,j=i+len; while(j+len-1<n) { merge(s,i,j-1,j-1+len,r); i+=2*len; j=i+len; } if(j<n) merge(s,i,j-1,n-1,r); else { while(i<n) { r[i]=s[i]; ++i; } } } void msort(int s[],int n)//归并排序 { int len=1; while(len<n) { mpass(s,n,len,r); len*=2; mpass(r,n,len,s); len*=2; } } int main() { printf("输入排序个数:\n"); int n; scanf("%d",&n); int i; for(i=0; i<n; i++) scanf("%d",&s[i]); msort(s,n); printf("%d\n",p); return 0; }
0 0
- 归并排序求逆序对数目
- 归并排序计算逆序对数目
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对~~~
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 斯坦福大学深度学习与自然语言处理第三讲:高级的词向量表示
- Ubuntu 输入正确的密码后重新返回到登陆界面
- 文件与流
- Scala 之 trait 关键字
- android,service实例,播放音乐
- 归并排序求逆序对数目
- 输出星号,倒三角
- 斯坦福大学深度学习与自然语言处理第四讲:词窗口分类和神经网络
- org.apache.axis2.AxisFault: Service class XXXXX must have public as access Modifier解决方案
- RealtimeBoard(可视化协同工作白板)
- JavaScript事件冒泡简介及应用
- [POJ3264]Balanced Lineup 做题笔记
- 求两个数的最大公约数
- POJ 2376 Cleaning Shifts 区间贪心