算法复习——归并排序
来源:互联网 发布:python格式化输出数字 编辑:程序博客网 时间:2024/05/17 07:08
其实这是那篇《二分法》的延伸版本……
归并排序跟堆排序一样可以稳定把时间压在O(log n),因为它始终会把区间二分处理,到了不能再二分时便开始合并区间。
接下来看一道题:codevs3286
这一道题就是典型的逆序对。要使两列火柴距离最小,明显就要让在两序列中相对大小相同的火柴在同一位置
于是我们对两列火柴进行排序,排序后用一个pos[a[i].p]=b[i].p表示第i个位置应放哪一根b列中的火柴,然后就可以对pos作归并排序求逆序对啦
代码如下:
type rec=record num,p:longint; end; arr=array[1..100000]of rec;var a,b:arr; pos,tmp:array[1..100000]of longint; n,i:longint; ans:qword;procedure merge(left,p,right:longint);var i,j,k:longint;begin i:=left; j:=p+1; k:=left; while (i<=p) and (j<=right) do begin if pos[i]<=pos[j] then begin tmp[k]:=pos[i]; inc(i); end else begin tmp[k]:=pos[j]; inc(j); ans:=(ans+p-i+1)mod 99999997; end; inc(k); end; while i<=p do begin tmp[k]:=pos[i];inc(i);inc(k); end; while j<=right do begin tmp[k]:=pos[j];inc(j);inc(k); end; for i:=left to right do pos[i]:=tmp[i];end;procedure mergesort(left,right:longint);var mid:longint;begin if left<right then begin mid:=(left+right) div 2; mergesort(left,mid); mergesort(mid+1,right); merge(left,mid,right); end;end;procedure qs(l,r:longint;var p:arr);var i,j,mid:longint; t:rec;begin i:=l; j:=r; mid:=p[(i+j)div 2].num; repeat while p[i].num<mid do inc(i); while p[j].num>mid do dec(j); if i<=j then begin t:=p[i]; p[i]:=p[j]; p[j]:=t; inc(i); dec(j); end; until i>j; if l<j then qs(l,j,p); if i<r then qs(i,r,p);end;begin readln(n); for i:=1 to n do begin read(a[i].num); a[i].p:=i; end; for i:=1 to n do begin read(b[i].num); b[i].p:=i; end; qs(1,n,a); qs(1,n,b); for i:=1 to n do pos[a[i].p]:=b[i].p; mergesort(1,n); writeln(ans mod 99999997);end.
0 0
- 算法复习——归并排序
- 复习数据结构:排序算法(四)——归并排序
- 排序算法复习之——内部排序算法之——归并排序
- 算法复习之归并排序
- 排序算法—归并排序
- 排序算法—归并排序
- 数据结构与算法复习之排序算法——冒泡、插入、快排、归并
- 归并排序(merge sort)——数据结构与算法复习
- 算法复习之两路归并排序
- 算法导论复习(2) 归并排序
- 算法——归并排序
- 算法 —— 归并排序
- 算法——归并排序
- 算法——归并排序
- 算法——归并排序
- 排序算法总结——归并排序
- 经典排序算法——归并排序
- 排序算法——归并排序
- ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)
- Pixhawk之姿态解算篇(3)_源码姿态解算算法分析
- Hash时取模为什么要模质数
- java学习笔记(三)
- Android开发中,那些让你相见恨晚的方法、类或接口
- 算法复习——归并排序
- Python相对导入导致SystemError的解决方案(译)
- mysql 10060远程不能访问
- updateByPrimaryKey和updateByPrimaryKeySelective insert和insertSelective
- 没有国家,你什么也不是
- Oracle学习笔记(二十二)——块
- 8款效果精美的 jQuery 加载动画和进度条插件
- HTML5 --Web Workers
- PHP数据对象映射模式