chhli3的个人博客分享 http://blog.sciencenet.cn/u/chhli3

博文

Use MergeSort to Count Inversions by Perl

已有 3260 次阅读 2012-11-9 11:11 |个人分类:Algorithms|系统分类:科研笔记

上篇博文实现了归并排序,现将其修改既能排序,又能对逆序数计数。
#!usr/bin/perl -w
if(!open MYFILE,'/Users/Sky/Desktop/data.txt')
{
        print "Cannot open the source file!";
}
$t=0;
foreach(<MYFILE>)
{
        $a[$t]=$_;
        $t++;
}
close(MYFILE);
$a=@a;
print &MergeSort(0,$a-1,0,@a);
sub MergeSort
{
        my($f,$r,$invers,@array)=@_;
        my $mi;
        if($f<$r)
        {
                $mi=int(($f+$r)/2);
                ($invers,@array)=&MergeSort($f,$mi,$invers,@array);
                ($invers,@array)=&MergeSort($mi+1,$r,$invers,@array);
                ($invers,@array)=&Merge_and_Count($f,$mi,$r,$invers,@array);
        }   
        return $invers,@array;      
}
sub Merge_and_Count
{        
        my($f,$mi,$r,$inv,@arra)=@_;
        $i=$f;
        $j=$mi+1;
        $k=0;
        my @arr=();
        while($i<=$mi && $j<=$r)
        {
                if($arra[$i]<=$arra[$j])
                {
                        $arr[$k++]=$arra[$i++];
                }else
                {
                        $arr[$k++]=$arra[$j++];
                        $inv=$inv+($mi-$i+1);
                }
        }        
        while($i<=$mi)
        {
                $arr[$k++]=$arra[$i++];            
        }
        while($j<=$r)
        {
                $arr[$k++]=$arra[$j++];
        }
        $i=$f;
        foreach(@arr)
        {
          $arra[$i++]=$_;
        }
        return $inv,@arra;
}
源文件merge_inversions.pl 对不起,由于本人水平有限,该程序处理小规模数据时,可以执行,但是不知道怎么回事,大规模数据等了很长时间也没出结果。


https://blog.sciencenet.cn/blog-752323-630772.html

上一篇:Realize MergeSort with Perl
下一篇:Install Perl Modules on Windows
收藏 IP: 210.77.7.*| 热度|

1 徐大彬

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-1 06:29

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部