归并排序求逆序对
来源:互联网 发布:微信推广淘宝链接 编辑:程序博客网 时间:2024/05/24 15:38
自己写的归并排序求逆序对,稍多了几行
var
a,b:array[1..100] of longint;
n,i,len1,len2,start1,start2,k,tot:longint;
procedure doit(x,y:longint);
var
p:longint;
f:boolean;
begin
if x=y then exit;
doit(x,x+(y-x) div 2);
doit(x+(y-x)div 2+1,y);
if y-x=1 then
if a[x]>a[y] then begin
p:=a[x];a[x]:=a[y];a[y]:=p;
inc(tot);
exit;
end;
start1:=x;
start2:=x+(y-x) div 2+1;
p:=0;
repeat
while (a[start1]<a[start2]) and (start1<x+(y-x) div 2+1) do begin
inc(p);
b[p]:=a[start1];
inc(start1);
end;
if start1=x+(y-x) div 2+1 then break;
while (a[start2]<=a[start1]) and (start2<y+1) do begin
inc(p);
b[p]:=a[start2];
inc(start2);
inc(tot,x+(y-x) div 2-start1+1);
end;
until (start1=x+(y-x) div 2+1) or (start2=y+1);
if start1=x+(y-x) div 2+1 then begin
for k:=start2 to y do begin
inc(p);
b[p]:=a[k];
end;
end
else begin
for k:=start1 to x+(y-x) div 2 do begin
inc(p);
b[p]:=a[k];
//inc(tot,y-x-(y-x) div 2);
end;
end;
for i:=x to y do a[i]:=b[i-x+1];
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
readln;
tot:=0;
doit(1,n);
for i:=1 to n do write(a[i],' ');
writeln;
writeln(tot);
readln;
end.
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对~~~
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 001、Hadoop安装配置
- res里面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)
- char *p 和char *p[]
- win7下查找jdk安装位置
- Executor框架
- 归并排序求逆序对
- SRM 400 Div1
- hadoop 2.4.x 2.5.x 源码编译指南
- 定时器实现
- 微信公众平台的开发者模式(PHP)
- [Pyhton]weakref 弱引用
- Window系统重装大全和超级简单的重装系统和远程重装系统的方法 (by 星空武哥)
- 编程珠玑第三章习题答案
- monk连接mongodb