《算法(第四版)》2.1.13纸牌排序,练习题学习小结

将一副扑克牌按花色排序(花色顺序是黑桃、红桃、梅花和方片),限制条件是所有牌都是背面朝上排成一列,而你一次只能翻看两张牌或者交换两张牌(保持背面朝上)。

不妨设黑桃=1,红桃=2,梅花=3,方片=4。
初始一个原始数组

for(int i = 0; i < 52; i ++) {
			a[i] = i / 13 + 1;
			System.out.print(a[i] + " ");
		}
		System.out.println();

打印结果:1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4
洗牌

List<Integer> aIndex = new ArrayList<Integer>();
		for(int i = 0; i < 52; i++) {
			aIndex.add(i);
		}
		Collections.shuffle(aIndex);
		for(int i = 0; i < 52; i ++) {
			buffer[i] = a[aIndex.get(i)];
		}
		for(int i = 0; i < 52; i ++) {
			a[i] = buffer[i];
			System.out.print(a[i] + " ");
		}
		System.out.println();

打印结果:1 4 3 4 4 3 2 4 2 3 1 3 3 4 3 4 1 2 1 2 1 1 4 2 4 1 2 2 3 1 4 4 1 1 2 2 2 2 3 1 1 3 4 4 3 2 4 3 3 2 3 1

我们的任务是将这组数据按照题目要求还原,思路的主体是每次翻看两张牌,寻找我们的目标花色,找到后再判断是否需要交换位置。目标花色顺序为黑桃、红桃、梅花和方片。
搜索顺序是从头到尾,锁定card1为第i张牌,一起翻看其后面的card2第i+1张牌,若两张牌同为目标花色,则card1为跳转至第i+2张牌;若只有card1是目标花色,则card1转至第i+1张牌;若两张牌都不是目标花色,则card2依次后移一个单位知道找到目标花色为止,然后两张牌进行置换,card1转至i+1继续搜索。当一种花色寻找完毕时,需要更换目标花色。具体代码如下:

public class PokerSort {

	public void sort(int[] a) {
		int card1 = 0, card2 = 1;
		int Num = 1;
		while(Num <= 4) {
			if(a[card1] == Num) {
				if(a[card2] == Num) {
					card1 = card1 + 2;
					card2 = card1 + 1;
				} else {
					card1 ++;
					card2 = card1 + 1;
				}
			} else {
				if(a[card2] == Num) {
					exch(a, card1, card2);
					card1 ++;
					card2 = card1 + 1;
				} else {
					card2 ++;
				}
			}
			if(card2 >= 52) {
				Num ++;
				card2 = card1 + 1;
			}
		}
	}
	
	public void exch(int[] a, int i, int j) {
		int t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
	
}

运行及结果

PokerSort poker = new PokerSort();
		poker.sort(a);
		for(int i = 0; i < 52; i ++) {
			System.out.print(a[i] + " ");
		}

1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值