一、举例
1. 男性
姓名 | 序号 |
---|---|
Alex | 0 |
Bob | 1 |
Chris | 2 |
David | 3 |
2 女性
姓名 | 序号 |
---|---|
Ada | 0 |
Becky | 1 |
Cindy | 2 |
Diana | 3 |
二、代码实现
-
男性类:
-
rank属性说明:喜欢的女性编号从最喜欢依次排名的数组
-
举例:Alex喜欢的女性排名分别是Ada,Diana,Cinday,Becky
- Ada序号:0
- Diana序号:3
- Cinday序号:2
- Becky序号:1
-
数组:rank
数组值(依次最喜欢的人编号) 0 3 2 1 数组下标(依次最喜欢的人) 0 1 2 3
/* 男性类 */ public class ManPerson { public ManPerson(String name, int num, int[] rank, boolean marry){ this.name = name; this.num = num; this.rank=rank; this.is_marry =marry; this.rank_num=0; } String name;//男生名字 int num;//男性编号 int[] rank;//喜欢的女性编号从最喜欢依次排名的数组 boolean is_marry;//当前男性是否结婚 WomanPerson marryPerson; int rank_num;//求婚对象指针 }
-
-
女性类
-
rank属性说明:数组下编号为第几个男生,数组值为第几个男生对应的喜欢程度,其中0表示最喜欢
-
举例:Ada喜欢的男性排名分别是Chris,Alex,Bob,David(数字越小表示越喜欢)
- 喜欢0号Alex程度:1
- 喜欢1号Bob程度:2
- 喜欢2号Chris程度:0
- 喜欢3号David程度:3
-
数组:rank
数组值(喜欢程度) 0 3 2 1 数组下标(男性编号) 0 1 2 3
/* 女性类 */ public class WomanPerson { public WomanPerson(String name, int num, int[] rank, boolean marry){ this.name = name; this.num = num; this.rank=rank; this.is_marry =marry; } String name;//女性名字 int num;//女性编号 int[] rank;//数组下编号为第几个男生,数组值为第几个男生对应的喜欢程度,其中0表示最喜欢 boolean is_marry;//当前是否结婚 ManPerson marry_person;//结婚对象是谁 int marry_num;//结婚对象的编号 }
-
-
算法主体
public class Main { public static void main(String[] args) { //初始化男性 ManPerson Alex = new ManPerson("Alex",0,new int[]{0,3,2,1},false); ManPerson Bob = new ManPerson("Bob",1,new int[]{0,1,2,3},false); ManPerson Chris = new ManPerson("Chris",2,new int[]{1,3,2,0},false); ManPerson David = new ManPerson("David",3,new int[]{2,0,1,3},false); //初始化女性 WomanPerson Ada = new WomanPerson("Ada",0,new int[]{1,2,0,3},false); WomanPerson Becky = new WomanPerson("Becky",1,new int[]{0,3,2,1},false); WomanPerson Cindy = new WomanPerson("Cindy",2,new int[]{3,0,2,1},false); WomanPerson Diana = new WomanPerson("Diana",3,new int[]{2,1,3,0},false); ManPerson[] boys = {Alex,Bob,Chris,David}; WomanPerson[] girls = {Ada,Becky,Cindy,Diana}; int i = 0; //当至少有一个男性没结婚,则循环所有男性 while(!boys[0].is_marry || !boys[1].is_marry || !boys[2].is_marry||!boys[3].is_marry){ if(i==4)i=0;//如果超出循环范围则重新循环 ManPerson cur_boy = boys[i];//得到当前求婚男性 if(!cur_boy.is_marry){//如果当前男的没结婚 int girl_num = cur_boy.rank[cur_boy.rank_num];//获取求婚男的最喜欢的女的编号 WomanPerson cur_girl = girls[girl_num];//获取求婚男最喜欢的女生 if(!cur_girl.is_marry){//如果当前男的最喜欢的女生没有结婚则求婚成功 System.out.println(cur_boy.name+"向"+cur_girl.name+"求婚成功!"); cur_boy.marryPerson =cur_girl;//结婚,求婚男结婚对象改成当前女的 cur_girl.marry_person=cur_boy;//女的结婚对象改成男的 cur_girl.marry_num=i;//女的结婚对象编号改成男的编号 cur_boy.is_marry=true;//男的是否结婚变为真 cur_girl.is_marry=true;//女的是否结婚变为真 cur_boy.rank_num++;//男的喜欢的列表排名人指针往后移,为了被绿后还能再选下一个 } else {//如果当前男的最喜欢的女的结婚了 if(cur_girl.rank[cur_girl.marry_num] < cur_girl.rank[i]){//如果当前女的结婚对象比当前求婚对象排名高,则求婚失败 System.out.println(cur_boy.name+"向"+cur_girl.name+"求婚失败!");//求婚失败 cur_boy.rank_num++;//如果当前求婚对象没有结婚对象排名高,则当前男求婚对象喜欢的列表指针往后移,对下一个人进行求婚 continue;//继续选择下一个人进行求婚 } else {//如果当前求婚对象比结婚对象排名高 System.out.println(cur_boy.name+"向"+cur_girl.name+"求婚成功!");//求婚成功 cur_girl.marry_person.is_marry=false;//当前女的结婚对象被绿,男的是否结婚变为假 System.out.println(cur_girl.marry_person.name+"和"+cur_girl.name+"离婚!"); cur_girl.marry_person.marryPerson =null;//离婚男没有结婚对象了 cur_girl.marry_person=cur_boy;//当前女的结婚对象变为求婚对象 cur_girl.marry_num=i;//当前女的结婚对象编号变为求婚对象编号 cur_boy.marryPerson =cur_girl;//求婚成功男结婚对象编号改成当前女的 cur_boy.is_marry=true;//求婚男的是否结婚变为真 cur_girl.is_marry=true;//当前女结婚为真 cur_boy.rank_num++;//求婚成功男喜欢列表指针+1,被绿后可以找下一个 } } } i++;//循环下一个男性 } System.out.println("最终结果:"); for (ManPerson boy : boys) { System.out.println(boy.name+" ❤ "+ boy.marryPerson.name); } } }
-
输出:
Alex向Ada求婚成功! Bob向Ada求婚失败! Bob向Becky求婚成功! Chris向Becky求婚成功! Bob和Becky离婚! David向Cindy求婚成功! Bob向Cindy求婚成功! David和Cindy离婚! David向Ada求婚失败! David向Becky求婚成功! Chris和Becky离婚! Chris向Diana求婚成功! 最终结果: Alex ❤ Ada Bob ❤ Cindy Chris ❤ Diana David ❤ Becky
三、代码复杂度分析
- 选择单身男性
o
(
n
)
o(n)
o(n)
- 单身男性向喜欢女性求婚
o
(
n
)
o(n)
o(n)
- 被求婚女性判断是否接受求婚 o ( 1 ) o(1) o(1)
- 单身男性向喜欢女性求婚
o
(
n
)
o(n)
o(n)
因此总的时间复杂度为 o ( n 2 ) o(n^2) o(n2)
如有不足,请大家指出,谢谢大家哦!