超快速排序(蓝桥杯,归并排序,acwing)

题目描述:

在这个问题中,您必须分析特定的排序算法----超快速排序。

该算法通过交换两个相邻的序列元素来处理 n 个不同整数的序列,直到序列按升序排序。

对于输入序列 9 1 0 5 4,超快速排序生成输出 0 1 4 5 9

您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序。

输入格式:

输入包括一些测试用例。

每个测试用例的第一行输入整数 n,代表该用例中输入序列的长度。

接下来 n 行每行输入一个整数 ai,代表用例中输入序列的具体数据,第 i 行的数据代表序列中第 i 个数。

当输入用例中包含的输入序列长度为 0 时,输入终止,该序列无需处理。

输出格式:

对于每个需要处理的输入序列,输出一个整数 op,代表对给定输入序列进行排序所需的最小交换操作数,每个整数占一行。

数据范围:

0≤n<500000
一个测试点中,所有 n 的和不超过 500000。
0≤ai≤999999999

输入样例:

5
9
1
0
5
4
3
1
2
3
0

输出样例:

6
0

分析步骤:

  第一:我们要交换相邻的数,交换的次数是前面比它大的数和后面比它小的数因为如果前面有比它大的数,那么它必定和前面的交换一次,使得前面大的数排到后面,同理可以知道比它小的数一定要和它交换到前面。这其实是一道求逆序对的题目。

             大家记住,相邻值交换,求逆序对就用归并排序

  第二:书写主函数,构建整体框架;

             将值输入进我们数组之中,输出归并排序的次数就可以

int main()
{
    int n ;
    while(cin>>n,n){
        for(int i = 0 ; i < n ; i ++){
            cin>>arr[i];
        }
        cout<<merge(0,n-1)<<endl;
    }
    
    
    return 0;
}

  第三:书写归并排序

             定义l , r为我们区间的边界,如果左边界大于等于右边界就返回,定义我们的 i 为左边界j 为 右边界的第一个所以为 mid+1 ,定义k 为新数组的第一个位置所以是0;

             继续归并排序直到将其分解为一个一个数将他们要更换的次数加起来,完成后返回res。

             进入while循环注意我们的条件左边区间不可以超过mid 右边区间不可以超过 r ;如果左边的区间小于等于右边的区间 则证明没有逆序对,则不需要更换位置,之接将其放入新数组中,如果左边区间的值 大于 右边区间的值 则res += mid - i + 1 ,因为逆序对的数量是mid - i + 1,res += mid - i + 1; 这句代码表示如果右半部分的元素 arr[j] 小于左半部分的元素 arr[i]那么它与左半部分的剩余元素都构成逆序对。通过计算 mid - i + 1,得到左半部分剩余元素的数量,即存在与 arr[j] 构成逆序对的数量。将这一数量累加到 res 中,以累计逆序对的总数。

         之后检查一下,左右两个部分有没有循环完毕,如果没有就让它继续循环,把数字放入新的数组之中。

         最后将tmp数组中刚刚存好的值,再次赋给arr数组。

LL merge(int l , int r){
     if(l >= r) return 0;
     int mid = (l+r) / 2;
     int i = l , j = mid + 1 , k =0;
     LL res=merge(l,mid)+merge(mid+1,r);
     while(i <= mid and j <= r){
         if(arr[i] <= arr[j]){
             tmp[k++] = arr[i++];
         }else{
             tmp[k++] = arr[j++];
           res += mid - i + 1;
         }
     }
    while(i <= mid){
        tmp[k++] = arr[i++];
    }
    while(j <= r){
        tmp[k++] = arr[j++];
    }
    for(int i = l , j = 0 ; i <= r ; j++ , i++){
       arr[i] = tmp[j];    
    }
    return res;
}

这两个图我给大家标出了i , j ,k的位置,大家可以好好注意注意,对于不理解的位置变化的那个式子,也可以根据这个图自己动手写一些,纸上得来终觉浅,得知此事要躬行

代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 5e5+10;
LL arr[N];
LL tmp[N];

// 定义归并排序函数,返回逆序对的数量
LL merge(int l , int r){
    if(l >= r) return 0; // 当序列长度为1时,逆序对数量为0
    
    int mid = (l+r) / 2; // 将数组分为两半
    
    // 递归地求解左半部分和右半部分的逆序对数量,并将结果相加
    LL res=merge(l,mid)+merge(mid+1,r);
    
    int i = l , j = mid + 1 , k =0; // i为左半部分的指针,j为右半部分的指针,k为临时数组的指针
    
    while(i <= mid and j <= r){
        if(arr[i] <= arr[j]){ // 当左半部分的元素小于等于右半部分的元素时,当前元素不会产生逆序对
            tmp[k++] = arr[i++]; // 将左半部分的元素放入临时数组中
        }else{
            tmp[k++] = arr[j++]; // 当右半部分的元素小于左半部分的元素时,当前元素会与左半部分的剩余元素构成逆序对
            res += mid - i + 1; // 将逆序对的数量累加上
        }
    }
    
    // 将剩余的元素放入临时数组中
    while(i <= mid){
        tmp[k++] = arr[i++];
    }
    while(j <= r){
        tmp[k++] = arr[j++];
    }
    // 将临时数组的元素复制回原数组
    for(int i = l , j = 0 ; i <= r ; j++ , i++){
        arr[i] = tmp[j];    
    }
    
    return res; // 返回逆序对的数量
}


int main()
{
    int n ;
    while(cin>>n,n){
        // 输入数组元素
        for(int i = 0 ; i < n ; i ++){
            cin >> arr[i];
        }
        // 调用归并排序函数,并输出逆序对的数量
        cout<< merge(0,n-1) << endl;
    }
    
    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469747.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

英伟达深夜放王炸|字节跳动游戏之路波折不断|文旅短剧风口将至|25岁QQ魅力不减,5亿人在用|云计算市场疯长152%|电商巨头齐瞄向富足悠闲银发族

新闻一分钟速览 文旅短剧风口将至&#xff0c;一地狂拍十部&#xff0c;影视界看法分歧&#xff0c;悬念丛生&#xff01;字节跳动游戏之路波折不断&#xff0c;能否逆风翻盘引关注。折叠屏手机痛症治愈&#xff0c;实力席卷高端市场&#xff0c;势头强劲&#xff01;雷军豪言…

12|检索增强生成:通过RAG助力鲜花运营

什么是 RAG&#xff1f;其全称为 Retrieval-Augmented Generation&#xff0c;即检索增强生成&#xff0c;它结合了检 索和生成的能力&#xff0c;为文本序列生成任务引入外部知识。RAG 将传统的语言生成模型与大规模 的外部知识库相结合&#xff0c;使模型在生成响应或文本时可…

014 Linux_同步

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;Linux &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多操作系统知识 文章目录 前言一、死锁&#xff08;1&#xff09;死锁概念 二、同步&#xff08;1&#xff09;同步概念&#xff…

Python入门(小白友好)

知识图谱 搭建环境 安装Python:Download Python | Python.org 安装PyCharm:Download PyCharm: The Python IDE for data science and web development by JetBrains 注意:专业版本是收费的,新手小白使用社区版(community)即可 创建第一个项目: 一些PyCharm的设置(也适用…

40年创新蝶变,IBM与中国共创新质生产力

2024年是“新质生产力”进入政府工作报告第一年&#xff0c;也是百年追求科技创新的IBM在华40周年&#xff0c;同时IBM全球正全力打造下一代企业生产力平台——突破性的企业混合云与AI。2023年&#xff0c;IBM推出基于开源混合云平台Red Hat Openshift的下一代企业级数据和AI平…

显隐特征融合的指静脉识别网络

文章目录 显隐特征融合的指静脉识别网络总结摘要介绍显隐式特征融合网络(EIFNet)掩膜生成模块(MGM)掩膜特征提取模块(MFEM)内容特征提取模块(CFEM)特征融合模块(FFM) THUFVS实验和结果数据集实现细节评估掩膜生成模型消融实验FFM模块门控层Batch Size损失函数超参数选择 论文 …

Python学习从0到1 day17 Python异常、模块、包

不走心的努力&#xff0c;都是在敷衍自己 ——24.3.19 万字长文&#xff0c;讲解异常、模块、包&#xff0c;看这一篇就足够啦 什么是异常? 当检测到一个错误时&#xff0c;python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的异常&am…

解决重装系统之后,开始菜单找不到Anaconda3相关图标

一、anaconda3安装后在开始菜单找不到&#xff0c;如下图所示 二、进入Anaconda3安装的位置 在安装位置按住shift键鼠标右键&#xff0c;打开poworshell&#xff0c;输入 start cmd最后的结果如图。

联发科MT8797迅鲲1300T规格参数_MTK5G安卓核心板方案定制

联发科MT8797&#xff08;迅鲲1300T&#xff09;平台采用Arm Cortex-A78和Cortex-A55组成的八核架构CPU&#xff0c;以及Arm Mali-G77MC9九核GPU&#xff0c;集成了AI处理器MediaTek APU&#xff0c;支持5G Sub-6GHz全频段和5G双载波聚合,支持1.08亿像素拍照和多镜头组合,以及1…

docker入门(五)—— 小练习,docker安装nginx、elasticsearch

练习 docker 安装 nginx # 搜素镜像 [rootiZbp15293q8kgzhur7n6kvZ home]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx …

模拟面试

1.TCP通信中的三次握手和四次挥手过程 三次握手 1.客户端像向服务器端发送连接请求 2.服务器应答连接请求 3.客户端与服务器简历连接 四次挥手&#xff1a; 客户端或服务器端发起断开请求,这里假设客户端发送断开请求 1.客户端向服务器发送断开请求 2.服务器应答断开请求 3.服…

c++类和对象(中)类的6个默认成员函数及const成员函数

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;类和对象 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 前言&#xff1a; 咱们之前也是…

OCP NVME SSD规范解读-13.Self-test自检要求

4.10节Device Self-test Requirements详细描述了数据中心NVMe SSD自检的要求&#xff0c;这一部分规范了设备自身进行各种健康检查和故障检测的过程。自检对于确保SSD的正常运行和提前预防潜在故障至关重要。 在进行设备自检时&#xff0c;设备应当确保不对用户数据造成破坏&am…

Unity类银河恶魔城学习记录11-2 p104 Inventoty源代码

此章节相对较难理解&#xff0c;有时间单独出一章讲一下 Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili InventoryItem.cs…

三维指静脉生物识别成像设备设计和多视图验证研究

文章目录 三维指静脉生物识别成像设备设计和多视图验证研究总结摘要介绍多视角指静脉识别模型结构内容特征编码Transformer(CFET)主导特征选择模块(DFSM) 实验和结果数据集实施细节视角研究池化层的作用消融实验和SOTA方法比较 论文: Study of 3D Finger Vein Biometrics on I…

openfeign使用fallback指定降级方法无法执行问题

直接点上代码&#xff1a; package com.fuXiApi.api;import com.common.util.MyResult; import com.fuXiApi.api.fallback.UserClientFallback; import com.fuXiApi.dto.UserDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bi…

【Python】使用selenium对Poe批量模拟注册脚本

配置好接码api即可实现自动化注册登录试用一体。 运行后会注册账号并绑定邮箱与手机号进行登录试用。 测试结果30秒一个号 import re import time import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options imp…

#Ubuntu(修改root信息)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;命令行终端&#xff1a; a.右键&#xff0c;open terminal b.快捷键 ctrlaltt &#xff08;2&#xff09;进行root修改 sudo passwd &a…

3月19日做题

[NPUCTF2020]验证&#x1f40e; if (first && second && first.length second.length && first!second && md5(firstkeys[0]) md5(secondkeys[0]))用数组绕过first1&second[1] 这里正则规律过滤位(Math.) (?:Math(?:\.\w)?) : 匹配 …

PX4|基于FAST-LIO mid360的无人机室内自主定位及定点悬停

目录 前言环境配置运行fast-lio修改px4位置信息融合方式编写位置坐标转换及传输节点 前言 在配置mid360运行环境后&#xff0c;可使用mid360进行室内的精准定位。 环境配置 在livox_ros_driver2的上级目录src下保存fast-lio的工程 git clone https://github.com/hku-mars/F…