编辑:之前我把我的排序方法称为“quicksort”,但现在感谢你们,我意识到这是完全错误的。这可能是某种类型的选择排序。
在这个构造函数中,我有一个卡片组(对象数组)和一个应该对应于对象数组的int数组:
public Deck ()
{
deck = new Card [52];
deckNum = new int [52];
for (int x = 0 ; x < 52 ; x++) // for each card in standard deck
{
deck [x] = new Card (x); // create card
deckNum [x] = x; // card number
}
}
之后,我有一个shuffle方法,它正确地进行了随机播放,因此我也将它改组为相应的int数组:
public void shuffle ()
{
int value;
int tempNum;
Card temp;
Random r = new Random();
for (int x = 0; x < deck.length; x++) // goes through all cards
{
value = r.nextInt(x + 1); // random value
//Shuffle Card array
temp = deck[value]; // new array
deck[value] = deck[x];
deck[x] = temp;
// Shuffle int array (not displayed)
tempNum = deckNum[value];
deckNum[value] = deckNum[x];
deckNum[x] = tempNum;
}
}
现在对于排序方法,当我尝试使用时,最终会再次洗牌。
public void quickSort ()
{
Card temp1;
for (int x = 0 ; x < deck.length - 1 ; x++) //sort first length-1 values
{
int lowPos = x; // assume first value is lowest
for (int y = x + 1 ; y < deck.length ; y++) {// check rest of list
if (deckNum [y] < deckNum [lowPos]) // uses the int array to find a lower value
{
lowPos = y;// make it the lowest
}
}
// swap low value with value in its proper position
//uses card array again
temp1 = deck [x];
deck [x] = deck [lowPos];
deck [lowPos] = temp1;
}
}
你可能只查看quicksort方法,但是以防万一,deckNum []是保存卡的整数值的数组,而deck []数组包含我试图操作的卡对象。
当我只使用一个int数组时,排序方法有效。
使用int数组可能完全错误,但老实说我不知道其他任何方式。一点帮助就会很棒!
答案 0 :(得分:1)
数组未排序的原因是 deckNum 数组未随循环前进而排序。
试试这个:
public void quickSort () {
Card temp1;
int temp2;
for (int x = 0 ; x < deck.length - 1 ; x++) //sort first length-1 values
{
int lowPos = x; // assume first value is lowest
for (int y = x + 1 ; y < deck.length ; y++) // check rest of list
if (deckNum [y] < deckNum [lowPos])
lowPos = y; // make it the lowest
temp1 = deck [x];
deck [x] = deck [lowPos];
deck [lowPos] = temp1;
//Add the following to your code
temp2 = deckNum [x];
deckNum [x] = deckNum [lowPos];
deckNum [lowPos] = temp2;
}
}
作为旁注,您正在实施的不是快速排序算法。看一下评论中提到的维基百科文章,了解快速排序的实际工作方式。