算法第四版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;
}
运行结果如下: