博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(笔试题)和0交换的排序
阅读量:5948 次
发布时间:2019-06-19

本文共 843 字,大约阅读时间需要 2 分钟。

题目:

一个整数组里包含0-(n-1)的排列 (0到(n-1)恰好只出现一次),如果每次只允许把任意数和0交换,求排好顺序至少交换多少次。

思路:

这是组合数学中的圈问题,可以把数组中的位置关系看成图的拓扑关系。

例如A[3]={2,0,1},2在0的位置,0在1的位置,1在2的位置,那么把它们画成图的拓扑结构的话,就是一个环(圈),即2->0->1->2。

这样的条件(排列成环(圈))用文字描述为:1、位置和位置上的数字或字符存在一一对应关系;2、每个数字或字符都不在自己应有的位置上;

上例我们通过交换1和0,再交换2和0,即可正确排序,次数为2.

一个排序总可以划分为不同的环(圈),独立成圈的不需要交换;

总结满足上述条件的规律:

  • 一个长度为m的圈,如果包含0,则交换(m -1)次可以恢复所有的数到原位
  • 一个长度为m的圈,如果不包含0,则交换(m+ 1) 次可以恢复所有的数到原位

代码:

#include 
using namespace std;int circle(int A[],bool isvisited[],int x){ int count=0; while(!isvisited[x]){ count++; isvisited[x]=true; x=A[x]; } if(count==0) return 0; else return count-1;}int main(){ int A[]={1,3,2,4,6,5,0}; int n=sizeof(A)/sizeof(A[0]); bool isvisited[n]; for(int i=0;i

运行结果:

4

该数组划分为3个圈,其中2和5独立成圈,无需交换,而其他五个数成圈,1->3->4->6->0->1,交换次数为5-1=4.

转载地址:http://woixx.baihongyu.com/

你可能感兴趣的文章
tomcat服务器的初始配置问题
查看>>
我的友情链接
查看>>
编译安装MongoDB
查看>>
js批量删除代码
查看>>
mac电脑清理docker垃圾文件脚本
查看>>
浅谈html语义化
查看>>
java打包exe
查看>>
磁盘分区开机自动挂载
查看>>
META http-equiv 大全
查看>>
Java类加载器( 死磕9)
查看>>
iOS学习之 播放gif动画
查看>>
convert(一)—— 部署managed
查看>>
maven技术(一)软件安装与配置
查看>>
[转载] 古墓丽影2
查看>>
JPA(三) JPA API初探
查看>>
华为S5700系列交换机配置链路聚合LACP报错。
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
二进制安装kubernetes1.14.1初次尝试-02
查看>>
Java基础学习总结(14)——Java对象的序列化和反序列化
查看>>
GNU开发工具——CMake进阶
查看>>