加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[算法] 求数组中倒置个数

(2014-02-19 23:32:27)
标签:

algorithm

inversion

mergesort

nlogn

分类: Algorithm.DataStruct

http://algs4.cs.princeton.edu/22mergesort/中有一道题是求数组中倒置个数的,原题如下:

Inversions. Develop and implement a linearithmic algorithm Inversions.java for computing the number of inversions in a given array (the number of exchanges that would be performed by insertion sort for that array). This quantity is related to the Kendall tau distance

解决思路:


http://s4/mw690/0026uWfMzy73ZCd9C8P43&690求数组中倒置个数" TITLE="[算法] 求数组中倒置个数" />

Inversions.java在做MergeSort的过程中顺便求出了数组中倒置个数。假设上图中已经获得左右两个子部分中的倒置个数并进行了MergeSort。现在学习一下做整个数组的Merge时如何顺便计算这一层的倒置个数。

  • 当aux[0]和aux[5]进行比较时,A小于E,则可知A比左半部分都小(少比较了4次),倒置+5
  • 当aux[0]和aux[6]进行比较时,C小于E,则可知C比半部分都小(少比较了4次),倒置+5
  • 当aux[2]和aux[7]进行比较时,E小于G,则可知E比半部分中G及其之后的数都小(少比较了2次),倒置=+(4-2+1)=+3

整个数组的倒置数为左边部分内部倒置数+右边部分内部倒置数+13。算法时间复杂度为NlogN。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:Markdown介绍
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有