【算法】数组中的逆序对的总数

  • 题目描述:
    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
  • 输入:
    5 4 3 2 1
  • 输出:
    10

  • 思想:
    本质上是归并排序,只是在每次当mid右半部的数小于mid前半部某个数i时(mid,i都是下标),统计逆序对count=mid-i+1

  • 算法代码:

public class InversePairs_Solution {
     public int InversePairs(int [] array) {
         if(array.length<=0)
             return 0;
         return mergesort(array,0,array.length-1);
     }
     public int  mergesort(int[] array,int l,int r){
         if(l>=r){
             return 0;
         }
         int mid=(l+r)/2;
         //左半排序,并返回该部分存在的逆序数
         int lnums=mergesort(array,l,mid);
         //右半排序,并返回该部分存在的逆序数
         int rnums=mergesort(array,mid+1,r);
         //左右归并,并返回逆序对数
        return  lnums+rnums+merge(array,l,mid,r);
     }
     public int merge(int[] array,int l,int mid,int r){
        int [] temp = new int[r-l+1]; 

        int count=0;
        int i=l,j=mid+1,t=0;
        while(i<=mid||j<=r){
            if(i>mid&&j<=r){
                temp[t++]=array[j++];
                continue;
            }else if(i<=mid&&j>r){
                temp[t++]=array[i++];
                continue;
            }
            if(array[i]>array[j]){//统计逆序对数
                temp[t++]=array[j++];
                count+=mid-i+1;

            }else {
                temp[t++]=array[i++];
            }
        }
        for(i=l;i<=r;i++){
            array[i]=temp[i-l];
        }
        return count;
     }
     public static void main(String[] args) {
        InversePairs_Solution cls = new InversePairs_Solution();
        int[] array= {5,4,3,2,1};
        System.out.println(cls.InversePairs(array));
        System.out.println(java.util.Arrays.toString(array));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课题 《计算机中的数制转换及加减运算》 教材分析:在计算机内部采用的都是二进制,让学生理解什么是二进制及二进制与十 进制之间的转换方法。 二、学情分析: 教材上这一部分写的比较简单但也比较抽象,以初一学生现在的认知结构还不是很容 易理解,而且直接引入什么"按权相加"的方法,学生必定听得一头雾水。因此,本课时 由浅入深,首先给出这些概念以帮助学生更好地理解和接受、消化吸收本节课的知识。 三、教学目标: 1、认知目标 (1)掌握进位制概念; (2)理解进制的本质; (3)掌握十进制和二进制的相互转换及二进制的加减法; (4)了解计算机所采用的数制及计算机采用二进制数的原因。 2、技能目标 掌握二进制数和十进制数转换以及加减运算规则。 3、能力目标 对学生思维能力进行拓展,激发他们探索计算机奥秘的欲望。 四、教学重点与难点: 1、难点:位权表示法 十进制转化为二进制 2、重点:二、十进制间相互转换及二进制的加减法 五、教学策略: 根据生活实际,从小学开始就学习了十进制,根据十进制来学习二进制,这样比较容 易学习和掌握。 六、教学过程 (以下教师的语言、活动简称"师",学生的活动简称"生") (一)数制 6分钟 师: 同学们,大家回想一下,我们最早学习的数学运算是什么? 生:加法。加减乘除…… 师:对,我们最开始学习的就是十以内的加法,之后是两位数的加法,在两位数加法 的学习中,老师是不是经常会说,要注意逢十进一?也就是我们平常说的别忘了进位。 像这样按进位的原则进行记数的方法叫做进位记数制。"进位记数制"简称为"数制"或"进 制"。我们平时用的最多的就是十进制了,那么,大家想一下,还有没有其他的进制呢? 比如说,小时、分钟、秒之间是怎么换算的? 生 一小时等于60分钟,一分钟等于60秒。 师 那我们平时会不会说我做这件事情用了102分钟呢?不是吧?我们一般会说,我花了一个 小时零42分钟,也就是说逢六十进一,这就是60进制。由此也可以推断出,每一种数制 的进位都遵循一个规则,那就是——逢N进1。这里的N叫做基数。所谓"基数"就是数制中表 示数值所需要的数字字符的总数,比如,十进制中用0——9来表示数值,一共有10个不同 的字符,那么,10就是十进制的基数,表示逢十进一。下面我们再引入一个新概念——"位 权"。 (二)数制转换及加减运算 26分钟 大家都知道,计算机中采用的是二进制,但用计算机解决实际问题时对数值的输入输 出通常使用十进制,这就有一个十进制向二进制转换或由二进制向十进制转换的过程。 也就是说,在使用计算机进行数据处理时首先必须把输入的十进制数转换成计算机所能 接受的二进制数;计算机在运行结束后,再把二进制数转换为人们所习惯的十进制数输 出。这种将数由一种数制转换成另一种数制称为数制间的转换。 先来讲一下二进制——十进制之间的转换。下面我们结合实例来讲解一下。 1、二进制数转换成十进制数 把二进制数转换成十进制数就是用"按权相加"法,把二进制数首先写成加权系数展开 式,然后按十进制加法规则求和。 例 二—十 (B D) 进制转换 规则:各位对应的十进制值之和;各位对应的十进制值为系数与其位权之积。 例 101B= ? D 解:位 权:22 21 20 二进制数:1 0 1 计 算:4 +0 +1=5D 这个比较简单,也容易掌握,我们做两个练习题,下面我们接着看一下十进制转换成 二进制。 2、十进制数转换为二进制数 整数十—二转换 规则:连续"(向左)除2取余,直到0"。也就是说"除2取余,逆序排列",也可以用倒除 法 例 29D= ? B 解: 接着做几道题,巩固一下十进制转换为二进制。 3. 二进制运算法则 (1)加法规则:"逢2进1" 0 + 0 = 0 1 + 0 = 0 + 1 = 1 1 + 1 = 10 例 101+110=? 解: 1 0 1 + 1 1 0 1 0 1 1 所以 101+110=1011 4.减法规则:"借1当2" 0 – 0 = 0 1 – 0 = 1 1 – 1 = 0 10 – 1 = 1 例 1100-110=? 解:  1 1 0 0 - 1 1 0 1 1 0 所以 1100-110=110 课堂中可能出现的重难点突破 二进制转换成十进制 (四)巩固练习 1、进位制是人们为了计数和运算方便而约定的记数系统。 2、十进制构成: (1)由0、1……9十个数码组成;(基数为10) (2)进位方法,逢十进一; (3)采用位权表示法,即一个数码在不同位置上所代表的值不同。 3、二进制的表示方法(同样由三部分组成) (1)由0、1两个数码来描述。(基数为2) (2)逢二进一; (3)位权大小为20、21、22...2n 4、二进制与十进制的相互转换 (1)、二进制转十进制——按权位展开 (

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值