【python2C】排序算法

news2024/12/27 16:17:47

题:逆序对(NXD)

对于给定的一段正整数序列a,逆序对就是序列中 a[i]​>a[j]​ 且 i<j 的有序对。

输入格式

第一行,一个正整数 n,表示序列中有 n个数,n<=5e5

第二行, n 个正整数以空格间隔,表示给定的序列。序列中每个数字不超过 1e9。

输出格式

输出序列中逆序对的数目。

样例输入
6
5 6 2 6 2 1

样例输出
10

解题思路

直娃统计版

从左到右逐个遍历a[i],计算 a[i+1:]的部分大于a[i]的NXD数,累加。

排序计算版

先降序排序a得到b,并记录排序前的原始序号ind

依次遍历b,b[j]对应的原始序号可计算其后的数,累加。
pop b[j] 然后再次sort,或 遍历比较剩余的数修改较前数的序号

冒泡排序版

最接近的排序算法。依次比较相邻数对,每遇到一对NXD就交换,总交换次数=NXD总数

归并排序版

 参考常用十大排序算法,可以看到
1. 冒泡排序最坏情况太慢了。
2. 计数排序可能最快,奈何不存在交换NXD。
3. 退而求其次,使用时间复杂度最稳定又快的 归并排序,
每次合并两个组时,若后组的当前数较小,则累加前组剩余数的数量(它们都是NXD)

python

def ZW(): # 直娃版
	cnt=0
	for i in range(n):
		b=m[i];	cnt+=sum([1 for j in range(i+1,n) if m[j]<b])
	return cnt
def SortPop(): # 排序计算
	cnt=0; m2=m.copy(); v=-1;
	a=sorted(m,reverse=True); nmax=len(a)-1
	for j in range(nmax):	# 最后一个数不成对
		if(v==a[j]): continue;	# 同值的已经处理过了
		v=a[j]; inds=[i for i in range(len(m2)) if m2[i]==v]
		nmax-=len(inds);
		while(len(inds)>0):
			ind=inds.pop();_=m2.pop(ind);cnt+=len(m2)-ind
		if(nmax<=0): break
	return cnt
def SortBubble(): # 冒泡法
	global m2
	cnt=0
	for i in range(n):
		for j in range(n-1-i):
			if(m2[j]>m2[j+1]):
				m2[j],m2[j+1]=m2[j+1],m2[j]; cnt+=1;
	return cnt
def SortMerge(iS=0,iE=None): # 归并法,iS,iE分别为首尾在m中的序号,顾头也顾尾
	global m2
	if(iE==None): iE=len(m2)-1
	if(iS>=iE): return 0
	iM=(iS+iE)//2; cnt=SortMerge(iS,iM)+SortMerge(iM+1,iE)
	temp=[]; i_S=iS;j_S=iM+1
	for j in range(j_S,iE+1):
		for i in range(i_S,iM+1):
			if(m2[i]<=m2[j]):
				temp.append(m2[i]);i_S+=1
			else:
				temp.append(m2[j]);cnt+=iM+1-i;i_S=i;j_S+=1;break
		else:
			break
	temp+=m2[i_S:iM+1]+m2[j_S:iE+1]
	m2=m2[:iS]+temp+m2[iE+1:]
	return cnt

C

//直娃版  
    for (int i=0,b,a;i<n;i++){
        b=m[i]; a=0;
        for (int j=i+1;j<n;j++){        	
	        if (m[j]<b) a++;
	    }
		cnt+=a;
    } 
//排序计算版 
	sort(m,m+n,cmp); // 降序排列 m
	int nmax=n-1; // 最大的对数 (尾-头的序号) 
    for (int i=0;i<n-1;i++){
        int s2=nmax-m[i].ii; // m[i]的逆序对数为s2= nmax-m[i].ii 
        for (int j=0;j<i;j++){ // 检查已处理过的m,即mi较大或相等的, 
            if (m[j].ii>=m[i].ii){ // 同mi且ii较大的排在前,借机一起减掉 
                s2--;
            }
        }
        s+=s2;
    }
//冒泡排序,每遇到一对NXD就交换,记录交换次数 ,~1.3s 
    for (int i=0,t;i<n;i++){
        for (int j=0;j<n-1-i;j++){
        	if(m[j]>m[j+1]){
        		t=m[j+1];m[j+1]=m[j];m[j]=t;cnt++;
			}
		}
    }
// 归并排序
long long MergeSort(int start, int end) // start和end分别是左边界和右边界
{
	if (start >= end) return 0;
	int mid = (start + end) / 2;
	long long cnt=MergeSort(start, mid)+MergeSort(mid + 1, end);
	// 合并两个有序序列
	int length = 0; // 表示辅助空间有多少个元素
	int i_start = start,	i_end = mid;
	int j_start = mid + 1,	j_end = end;
	while (i_start <= i_end && j_start <= j_end){
		if (m[i_start] <= m[j_start]){
			temp[length++] = m[i_start++]; 
		}else{
			temp[length++] = m[j_start++]; 
			cnt+=mid+1-i_start; // cnt
		}
	}
	// 把剩下数的合并
	while (i_start <= i_end)temp[length++] = m[i_start++]; 
	while (j_start <= j_end)temp[length++] = m[j_start++];
	// 把辅助空间的数据放到原空间
	for (int i = 0; i < length; i++) m[start + i] = temp[i];
	return cnt;
}

小结

python运行时间对比, 冒泡法>>直娃版>排序版>归并版

C++运行时间对比,排序版,冒泡法>直娃版>>归并版

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习之git

github 创建远程仓库 代码推送 Push 代码拉取 Pull 代码克隆 Clone SSH免密登录 Idea集成GitHubGitee码云 码云创建远程仓库 Idea集成Gitee码云 码云连接Github进行代码的复制和迁移GitLab gitlab服务器的搭建和部署 Idea集成GitLabgit概述 一切皆本地 版本控制工具 集中…

读软件开发安全之道:概念、设计与实施15安全测试

1. 安全测试 1.1. 测试是开发可靠、安全代码中的关键一环 1.2. 测试安全漏洞的目的是主动检测 1.3. 模糊测试是一种强大的补充技术&#xff0c;可以帮助我们找到更深层次的问题 1.4. 针对当前漏洞创建的安全回归测试&#xff0c;目的是确保我们不会再犯相同的错误 1.5. 大…

LabVIEW焊缝视觉识别系统

随着自动化技术的发展&#xff0c;焊接工艺也在向智能化和自动化转型。介绍了一种基于LabVIEW开发的自动化焊接机器人视觉识别系统&#xff0c;用于提高焊接质量和效率&#xff0c;特别适用于复杂或危险环境下的操作。 项目背景 在传统焊接工艺中&#xff0c;焊接质量和效率受…

linux 文件管理命令

Ctrl h, 在对应的文件夹路径下显示文件内容 2.“~”、“/”、“./”分别代表什么&#xff1f; https://blog.csdn.net/shuaiqidexiaojiejie/article/details/132563658 2.1&#xff0c;“~”表示主目录&#xff0c;也就是当前登录用户的用户目录 cd ~, 表示返回到Home目录 2.2…

使用 GZCTF 结合 GitHub 仓库搭建独立容器与动态 Flag 的 CTF 靶场以及基于 Docker 的 Web 出题与部署

写在前面 关于 CTF 靶场的搭建&#xff08;使用 CTFd 或者 H1ve&#xff09;以及 AWD 攻防平台的搭建&#xff0c;勇师傅在前面博客已经详细写过&#xff0c;可以参考我的《网站搭建》专栏&#xff0c;前段时间玩那个 BaseCTF&#xff0c;发现它的界面看着挺不错的&#xff0c…

esp8266根据httpserver状态,调用网络唤醒,实现一键开机

esp8266根据httpserver状态&#xff0c;调用网络唤醒&#xff0c;实现一键开机 一.开发板程序二. 服务端三.服务端状态变更 一.开发板程序 #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiUdp.h> #include <ArduinoJson.h>/…

C语言深入理解指针1

1. 内存和地址 1.1内存 内存空间如何高效管理?把内存划分一个个的内存单元&#xff0c;每个内存单元的大小取一个字节一个比特位可以存储一个2进制的位1或者0&#xff0c;那么一个内存单元可以放8个比特位&#xff0c;每个内存单元都有一个编号&#xff0c;有了内存单元的编…

Golang | Leetcode Golang题解之第389题找不同

题目&#xff1a; 题解&#xff1a; func findTheDifference(s, t string) (diff byte) {for i : range s {diff ^ s[i] ^ t[i]}return diff ^ t[len(t)-1] }

自然美景短视频素材哪里找?9个美景视频素材库网站分享

你是否曾被窗外的落日余晖震撼&#xff0c;或是被雄伟的山脉和蔚蓝的大海深深吸引&#xff1f;想要分享这世界的美好&#xff0c;却苦于没有合适的视频素材&#xff1f;今天&#xff0c;就让我带你探索那些充满自然韵味的素材宝库&#xff0c;帮你捕捉和分享自然的美丽&#xf…

Linux下安装MySQL8.0

一、安装 1.下载安装包 先创建一个mysql目录&#xff0c;在将压缩包下载到此 # 下载tar包 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz等待下载成功 2.解压mysql8.0安装包 tar xvJf mysql-8.0.20-linux-glibc2.12-x86…

sqli-labs第五、六关详解

第五关不同于前面四关&#xff0c;涉及到盲注 首先看看是字符型注入还是数字型注入 用单引号闭合后&#xff0c;and 12无回显&#xff0c;说明字符型注入&#xff0c;接下来就要靠猜了&#xff0c;首先猜数据库长度是多少 长度为8的时候&#xff0c;正常回显&#xff0c;所以数…

DFS解决floodfill算法

文章目录 1. 图像渲染2. 岛屿数量3. 岛屿的最大面积4. 被围绕的区域5. 太平洋大西洋水流问题6. 扫雷游戏7. 机器人的运动范围 1. 图像渲染 算法原理&#xff1a; 这题不需要创建visit数组去记录使用过的节点&#xff0c;因为我每次dfs都尝试修改image数组的值&#xff0c;当下…

电阻器件的选型

电阻选型需要的注意点&#xff1a; 老化系数:电阻器在额定功率长期负荷下&#xff0c;阻值相对变化的百分数&#xff0c;它是表示电阻器寿命长短的参数。 噪声:包括热噪声和电流噪声两部分&#xff0c;电阻是一个耗能的器件&#xff0c;电阻器是消耗能量的。 电阻的选型需要关注…

STM32 Debug卡死在BKPT 0xAB

今天在调试程序的时候遇到了这个问题&#xff0c;最后发现是因为没有初始化串口&#xff0c;就调用了printf函数导致的&#xff0c;如果不需要用串口调试数据&#xff0c;那么需要把它们注释掉&#xff0c;否则就会出现这个问题&#xff01;

Force Yc团队最新第五次创作引导页源码

Force Yc团队最新第五次创作引导页源码 此源码可以播放自己的音乐 无法播放视频背景&#xff01;~ 音乐修改:music 音乐名称:bgm.mp3 LOGO修改:images 图片名字:top-logo.mp4 文本修改:index.html Notepad编辑 Force Yc团队最新第五次创作引导页源码

window下使用msys2安装openssl

目录 参考官网解压用cmake直接安装msys2安装配置编译安装 用perl安装打开命令行工具安装编译 参考 openssl 安装 官网 https://www.openssl.org/source 解压 D:\c\openssl-3.0.1 D:\c\openssl-1.1.1u用cmake直接安装 参考官方教程https://github.com/libevent/libevent/b…

Python画笔案例-026 绘制三星连线

1、绘制三星连线 通过 python 的turtle 库绘制三星连线的图案&#xff0c;如下图&#xff1a; 2、实现代码 绘制一个三星连线的图案&#xff0c;以下为实现代码&#xff1a; """三星连线.py """ import turtleturtle.pensize(2)for _ in range(…

用EM算法估计GMM参数的实现

EM算法&#xff0c;即期望最大化算法&#xff08;Expectation Maximization Algorithm&#xff09;&#xff0c;是一种在统计学中用于估计概率模型参数的类似极大似然估计的迭代算法&#xff0c;特别适用于模型中包含隐变量或者数据由多个混合分布组成的情况。隐变量&#xff0…

模型 RULER情绪管理

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。识别情绪&#xff0c;智慧表达&#xff0c;和谐生活。 1 RULER情绪管理模型的应用 1.1 RULER情绪管理模型在小学教育中的实践 背景&#xff1a; 在一所注重学生全面发展的小学中&#xff0c;教师们发…

【kubernetes】Service 介绍和应用

一&#xff0c;Service介绍 四层代理是基于传输层&#xff08;第四层&#xff09;工作的代理&#xff0c;主要在传输层&#xff08;如TCP、UDP协议&#xff09;上转发和管理数据流 七层代理是基于应用层&#xff08;第七层&#xff09;工作的代理&#xff0c;能够对应用层协议…