算法第四版2.1.13纸牌排序

算法第四版2.1.13 纸牌排序

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

首先,我们可以分别设置扑克牌的顺序 设置黑桃为1 红桃为2 梅花为3 而方片就为4

首先设置一个初始数组:

Integer[] integers = {1,4,3,4,4,3,1,3,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,4,4,4,3,2,4,3,3,2,3,2};

思路:每次翻看两张牌,寻找我们的目标花色,再判断是否需要进行位置的交换。寻找牌的顺序为黑桃->红桃->梅花->方片。
首先,我们需要一个start和一个end作为两个指针,一个为慢指针、一个为快指针。那么就会有下面几种情况:
1)start指针为目标花色

  • end为目标花色:那么在start小于end-1的情况下,只需要使得start自增1。而start和end只距离一的话,就需要直接将start加2,并且end要在start的基础之上加1。使得start不为目标花色。
  • end不为目标花色:那么start和end都要向前移动一位。直到start不为目标花色或者end为目标花色

2)start指针不为目标花色

  • end为目标花色:就需要在下一轮进行交换
  • end不为目标花色:end就需要下移一位,直到找到目标花色
public static void sort(Integer[] willSort){
        int length = willSort.length;
        //扑克牌比较开始
        int start = 0;
        int end = 1;
        //扑克牌的顺序  设置黑桃为1 红桃为2 梅花为3 而方片就为4
        int Num = 1;
        //标明这是交换还是翻开两张纸牌  true为翻开
        boolean flag = true;
        while(Num<=4){
            if(willSort[start].equals(Num)){  //说明start是和当前所需要寻找的花色是一样的
                //下面判断end的花色是否与start寻找的花色是一样的
                if(!willSort[end].equals(Num)){  //这里表示:start和end表现的花色是不一致的 但start的花色是和寻找的一样
                    start++;
                    end++;
                }else{  //这里表示:start和end表现的花色与当前寻找的花色是一致的
                    if(start<(end-1)) {   //由于start和end可能会隔的比较远,所以如果start和end不临近的话,直接使得start++即可
                        start++;
                    }else{  //这里表示start和end只相隔1
                        start = start+2;
                        end = start+1;
                    }
                }
            }else{   //这里表示start寻找的花色与当前寻找的花色不一致
                if(willSort[end].equals(Num)) {  //这里表示:end当前花色与寻找的一致是一致
                    if(flag){  //表示找到了,那么下一次就要交换。
                        flag = false;
                    }else{
                        //进行交换
                        exch(willSort,start,end);
                        start++;
                        end++;
                        flag = true;
                    }
                }else{  //这里表示:start和end的花色与寻找的都不一样
                    end++;
                }
            }
            //如果end超过52,说明已经检索完了,所以要进行下一个花色的检索
            if(end>=52){
                Num++;
                end = start+1;
            }
        }
    }


	 /**
     * 进行交换
     */
    private static void exch(Comparable[] a,int i,int j){
        Comparable t = a[j];
        a[j] = a[i];
        a[i] = t;

    }

运行结果如下:
排序好之后的数组

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值