java对数组进行排序_用Java对数组进行排序所需的最少交换

java对数组进行排序

Problem:

问题:

In this problem, we would have an unordered array with consecutive distinct natural numbers [1,2,3,..n], where n is the size of the array. We have to find the minimum number of swaps required to sort the array in ascending order.

在此问题中,我们将拥有一个具有连续的不同自然数[1,2,3,.. n]的无序数组,其中n是数组的大小。 我们必须找到按升序对数组进行排序所需的最小交换次数

Note: Think and try by yourself before looking to the solution...

注意:在寻求解决方案之前,请自己思考并尝试...

Solution:

解:

This problem can be solved easily by observing the actual position of elements and their current position , the actual position of element in sorted array will be the a[cur]-1 (element-1), by tracking the actual position of element if we come back to the current element then there exist a cycle , then count the size of that cycle , the number of swaps will be cycling size-1, do this for all the cycles and add them together.

通过观察元素的实际位置及其当前位置,可以很容易地解决此问题,如果我们跟踪元素的实际位置,则排序数组中元素的实际位置将为a [cur -1 ] ( element-1 )回到当前元素,然后存在一个循环,然后计算该循环的大小 ,交换次数将为循环size-1 ,对所有循环进行此操作并将它们加在一起。

Example:

例:

Let an array: A =[2, 4, 5, 1, 3]

设一个数组:A = [2,4,5,1,3]

minimum swap required to sort an array in java

There exist two cycles:
Cycle 1: 2 → 4 → 1 → 2
Cycle 2: 5 → 3 → 5

存在两个周期:
周期1:2→4→1→2
周期2:5→3→5

Size of cycle = number of nodes:
Size of cycle 1=3
Size of cycle 2=2

周期大小=节点数:
周期1的大小= 3
周期2 = 2

Number of swaps: (3-1)+(2-1) = 3

掉期数量: (3-1)+(2-1)= 3

Program:

程序:

import java.io.*;
import java.math.*;
import java.util.*;
public class Swap {
static int minimumSwaps(int[] arr) {
int swap=0;
boolean visited[]=new boolean[arr.length];
for(int i=0;i<arr.length;i++){
int j=i,cycle=0;
while(!visited[j]){
visited[j]=true;
j=arr[j]-1;
cycle++;
}
if(cycle!=0)
swap+=cycle-1;
}
return swap;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
int res = minimumSwaps(arr);
System.out.println(res);
scanner.close();
}
}

Output

输出量

    4
4 3 2 1
2

翻译自: https://www.includehelp.com/java-programs/minimum-swaps-required-to-sort-an-array.aspx

java对数组进行排序

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

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

相关文章

如何实现查询附近的人?

查询附近的人或者是附近的商家是一个实用且常用的功能,比如微信中“附近的人”或是美团外卖中“附近商家”等,如下图所示: 那它是如何实现的呢?我们本文就一起来看。 我们本文的面试题是,使用 Redis 如何实现查询附近的人? 典型回答 在说如何实现地理位置查询之前,首…

第五六七章(PTA复习)

第五六七章图形界面线程IO图形界面 主要的布局管理器类包括流布局(FlowLayout)、边界布局(BorderLayout)、网格布局(GridLayout)、卡 片 布 局 (CardLayout) 、 网 格 包 布 局(CardBagLayout) 线程 答案&#xff1a;B IO

Redis 有哪些数据类型?

Redis 的数据类型可谓是 Redis 的精华所在&#xff0c;同样的数据类型&#xff0c;例如字符串存储不同的值对应的实际存储结构也是不同&#xff0c;当你存储的 int 值是实际的存储结构也是 int&#xff0c;如果是短字符串&#xff08;小于 44 字节&#xff09;实际存储的结构为…

导出/入数据库

导出/入数据库1、以SQL文件的方式1.1导出1.2 导入2、以mdf和ldf数据库文件的方式2.1导出2.1.1 脱机2.1.2 到数据库的数据路径&#xff0c;拷贝出mdf,ldf文件2.1.3 将原数据库设置为online状态即可正常使用2.2导入数据库&#xff08;切记导入之前要先将控制权限打开&#xff09;…

第八章Transact-SQL程序设计

第八章Transact-SQL程序设计8.1_变量8.1.1_局部变量8.1.2_全局变量8.2_流程控制语句8.2.1_IF...ELSE语句8.2.2_while循环语句8.1_变量 8.1.1_局部变量 局部变量的声明定义&#xff1a; Declare Variable_name Datatype[, Variable_name Datatype]…--举例&#xff1a; decla…

如何删除多余系统引导项

我们很多人都装过双系统&#xff0c;但是有时候装的当中却不想装了或者装不成功&#xff0c;生成的多余系统引导项怎么删除呢&#xff1f;下面分享下我的经验&#xff1a;win7&#xff08;XP&#xff09;下如何删除多余的系统引导项。关键词&#xff1a;删除多余系统引导项&…

动态规划编程面试_面试的前25大动态编程问题

动态规划编程面试Dynamic programming is one of the most asked paradigms in any product-based company interviews. You can expect DP in online assessments also if you are in touch with any product-based company. For beginner its, of course, a Tough nut to cra…

Redis 内存用完会怎样?

在某些极端情况下,软件为了能正常运行会做一些保护性的措施,比如运行内存超过最大值之后的处理,以及键值过期之后的处理等,都属于此类问题,而专业而全面的回答这些问题恰好是一个工程师所具备的优秀品质。 我们本文的面试题是 Redis 内存用完之后会怎么? 典型回答 Red…

Hapoxy+keepalived实现双主高可用负载均衡

在测试了NginxKeepalived的负载均衡后&#xff0c;也对HaproxyKeepalived双主模式做了测试&#xff0c;双主的模式充分利用了服务器资源&#xff0c;这样不会导致服务器浪费。 这里举例说明&#xff1a; 默认情况下&#xff0c;第一台负载均衡器主要分发 www.breaklinux的请求…

c语言中的printf函数_C语言中的printf()函数与示例

c语言中的printf函数C语言中的printf()函数 (printf() function in C) The printf() function is defined in the <stdio.h> header file. 在<stdio.h>头文件中定义了printf()函数 。 Prototype: 原型&#xff1a; int printf(const char* str, . . .);Parameter…

第一章数据库绪论

第一章数据库绪论1.1_数据库系统概述1.1.1_数据库的四个基本概念1.1.2_数据库系统的特点1.2_数据库模型1.2.1_两类数据模型1.2.2_概念模型1.2.3_数据模型的组成要素1.2.4_常用的数据模型1.3_数据库系统的结构1.3.2_数据库系统的三级模式结构1.3.3_数据库的二级映像功能与数据独…

如何保证 Redis 消息队列中的数据不丢失?

Redis 最常见的业务场景就是缓存读取与存储,而随着时间的推移,有人开始将它作为消息队列来使用了,并且随着 Redis 版本的发展,在 Redis.2.0.0 中新增了发布订阅模式(Pub/Sub)代表着官方开始正式支持消息队列的功能了,直到今天为止还有部分公司在实现轻量级的消息队列时,…

9款基于CSS3 Transitions实现的鼠标经过图标悬停特效

之前给大家分享了很多css3实现的按钮特效。今天给大家分享9款基于CSS3 Transitions实现的鼠标经过图标悬停特效。这款特效适用浏览器&#xff1a;360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗. 不支持IE8及以下浏览器。效果图如下&#xff1a; 在线预览 源码下…

Redis 如何实现分布式锁?

锁是多线程编程中的一个重要概念,它是保证多线程并发时顺利执行的关键。我们通常所说的“锁”是指程序中的锁,也就是单机锁,例如 Java 中的 Lock 和 ReadWriteLock 等,而所谓的分布式锁是指可以使用在多机集群环境中的锁。 我们本文的面试题是,使用 Redis 如何实现分布式…

第二章关系数据库

第二章关系数据库2.1 关系模型概述&#xff08;略&#xff09;2.2 关系操作2.2.1_基本关系操作2.2.2_关系数据库语言的分类2.3 关系的完整性2.3.1_关系的三类完整性约束2.3.2_实体完整性2.3.3_参照完整性2.3.4_用户定义的完整性2.4 关系代数2.4.1_传统的集合运算2.4.2_专门的关…

线程----Monitor(互斥锁)类设置超时值

Monitor类与Lock语句相比&#xff0c;Monitor类的主要优点是&#xff1a;可以添加一个等待被锁定的超时值。缺点&#xff1a;开销非常大using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.T…

第三章关系数据库标准语言SQL

第三章关系数据库标准语言SQL3.1_SQL的特点3.3_数据定义3.3.1_基本表的定义、删除与修改3.3.3_索引的建立与删除3.4_数据查询3.4.1_查询时消除重复行3.4.2_涉及空值的查询3.4.3_BETWEEN AND的使用3.4.4_字符匹配3.4.5_聚集函数3.5_数据更新3.5.1_插入数据3.5.2_修改数据3.5.3_删…

使用 Redis 如何实现延迟队列?

延迟消息队列在我们的日常工作中经常会被用到&#xff0c;比如支付系统中超过 30 分钟未支付的订单&#xff0c;将会被取消&#xff0c;这样就可以保证此商品库存可以释放给其他人购买&#xff0c;还有外卖系统如果商家超过 5 分钟未接单的订单&#xff0c;将会被自动取消&…

第五章数据库完整性

第五章数据库完整性5.1_数据库完整性概述5.2_实体完整性5.2_参照完整性5.3_用户定义的完整性5.1_数据库完整性概述 1.数据库的完整性&#xff1a; 数据的正确性和相容性 2.数据的完整性和安全性的区别&#xff1a; 数据的完整性&#xff1a;防止数据库中存在不符合语义的数据&a…

KVC/KVO实现原理分析

2019独角兽企业重金招聘Python工程师标准>>> 1. 函数调用&#xff08;消息&#xff09;实现分析&#xff1a; 我们看这条语句&#xff1a; [代码]c#/cpp/oc代码&#xff1a; 1 [self.person setValue:"Vincent"forKey:"name"]; 就会被编译器…