当前位置: 首页 > news >正文

排序---P1116 车厢重组

P1116 车厢重组

来自 <车厢重组 - 洛谷>

其实这道题本质上就是求逆序对的过程:

两种方法:一个是通过冒泡排序过程求逆序对;一个是通过归并排序过程求逆序对。

法一:当通过冒泡排序进行正序排列时,相邻两个数需要进行交换时,则说明这是一个逆序对,逆序对++。

import java.util.Scanner;



/**

 * 用冒泡思想算逆序对,每次进行交换时,逆序对++

 */

public class Main {

    public static void main(String[] args) {

        int n,ans=0;

        Scanner scanner=new Scanner(System.in);

        n = scanner.nextInt();

        int[] a=new int[n];

        for(int i=0;i<n;i++){

            a[i]=scanner.nextInt();

        }

        for(int i=1;i<=n-1;i++){

            for(int j=0;j<=n-1-i;j++){

                if(a[j]>a[j+1]){

                    int t=a[j];

                    a[j]=a[j+1];

                    a[j+1]=t;

                    ans++;

                }

            }

        }

        System.out.println(ans);

    }

}

法二:归并排序,逆序对=左边有序数列的逆序对+右边有序数列的逆序对+处于左右两边的逆序对

 

import java.util.Scanner;



/**

 * 用归并的思路算逆序对

 */

public class Main {

    public static int n;

    public static int[] a=new int[100005];

    public static int[] temp=new int[100005];

    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);

        n=scanner.nextInt();

        for(int i=0;i<n;i++){

            a[i]=scanner.nextInt();

        }

        System.out.println(merge_sort(0,n-1));

    }

    public static int merge_sort(int l,int r){

        if(l>=r){

            return 0;

        }

        int mid=(l+r)/2;

        int res=merge_sort(l,mid)+merge_sort(mid+1,r);

        int i=l,j=mid+1,k=0;

        while(i<=mid&&j<=r){

            if(a[i]<=a[j]){

                temp[k++]=a[i++];

            }

            else{

                res+=mid-i+1;

                temp[k++]=a[j++];

            }

        }

        while(i<=mid){

            temp[k++]=a[i++];

        }

        while (j<=r){

            temp[k++]=a[j++];

        }

        for(i=l,j=0;i<=r;i++,j++){

            a[i]=temp[j];

        }

        return res;

    }

}

相关文章:

  • spring boot项目 mvn test 和 mvn clean install 和 mvn test-compile 识别不到测试类无法运行单元测试
  • Linux中生成so库的文件引用另一个so库问题的解决
  • 基于51单片机NEC协议红外遥控发送接收仿真设计( proteus仿真+程序+原理图+报告+讲解视频)
  • sci投稿流程(从投稿到录用全流程解析)
  • Ubuntu镜像源cn.arichinve.ubuntu.com不可用原因分析和解决
  • 瑞云介绍使用ZBrush和Marmoset工具包制作的风格化巨怪战斗机
  • chrome extensions mv3通过content scripts注入/获取原网站的window数据
  • Redis实现API访问频率限制
  • [FineReport]安装与使用(连接Hive3.1.2)
  • ORACLE Redo Log Buffer 重做日志缓冲区机制的设计
  • Midjourney 生成油画技巧
  • Neo4j最新安装教程(图文版)
  • 美容店预约小程序搭建流程
  • 【算法笔记】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
  • Java集成Onlyoffice以及安装和使用示例,轻松实现word、ppt、excel在线编辑功能协同操作,Docker安装Onlyoffice
  • 深度学习 二:COVID 19 Cases Prediction (Regression)
  • 03-Zookeeper客户端使用
  • Java进阶篇--网络编程
  • 【分布式云储存】Springboot微服务接入MinIO实现文件服务
  • 用go实现http服务端和请求端
  • 海拔四百公里的救赎
  • 加快从数量增长向品质跃升转变,促进生态空间与城市功能有机共生!龚正调研公园城市建设工作
  • 自然资源部:一季度存量商品房转移登记办理量同比增长超三成
  • 习近平会见柬埔寨国王西哈莫尼
  • 遇见古籍里的先贤,山西博物院“晋国垂棘”明日开展
  • 黄山景区成功搜救一名“野游”游客,当事人受处罚并付救援费