Skip to content

Commit 05edb7b

Browse files
implemented sorting algorithms and improved toString method
1 parent dcd9606 commit 05edb7b

1 file changed

Lines changed: 67 additions & 5 deletions

File tree

ch13/Deck.java

Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import java.util.Arrays;
22
import java.util.Random;
3+
import java.lang.StringBuilder;
34

45
/**
56
* A deck of playing cards (of fixed size).
@@ -50,14 +51,21 @@ public void print() {
5051
* Returns a string representation of the deck.
5152
*/
5253
public String toString() {
53-
return Arrays.toString(this.cards);
54+
StringBuilder deckStringBuilder = new StringBuilder();
55+
for (Card card : this.cards) {
56+
deckStringBuilder.append(card);
57+
deckStringBuilder.append('\n');
58+
}
59+
60+
deckStringBuilder.deleteCharAt(deckStringBuilder.lastIndexOf("\n"));
61+
return deckStringBuilder.toString();
5462
}
5563

5664
/**
5765
* Chooses a random number between low and high, including both.
5866
*/
5967
public int randomInt(int low, int high) {
60-
return r.nextInt(low) + (high - low);
68+
return low + r.nextInt(high);
6169
}
6270

6371
/**
@@ -75,7 +83,7 @@ public void swapCards(int i, int j) {
7583
*/
7684
public void shuffle() {
7785
int deckSize = this.cards.length;
78-
for (int i = 0; i < deckSize; i++) {
86+
for (int i = 0; i < deckSize * 7; i++) {
7987
swapCards(randomInt(0, deckSize - 1),
8088
randomInt(0, deckSize - 1));
8189
}
@@ -126,20 +134,74 @@ public Deck subdeck(int low, int high) {
126134
* Combines two previously sorted subdecks.
127135
*/
128136
public static Deck merge(Deck d1, Deck d2) {
129-
return null;
137+
Deck result = new Deck(d1.cards.length + d2.cards.length);
138+
int i = 0; // index of d1
139+
int j = 0; // index of d2
140+
int maxIndex1 = d1.cards.length;
141+
int maxIndex2 = d2.cards.length;
142+
for (int k = 0; k < result.cards.length; k++) {
143+
if (i >= maxIndex1) {
144+
result.cards[k] = d2.cards[j];
145+
j++;
146+
}
147+
148+
else if (j >= maxIndex2) {
149+
result.cards[k] = d1.cards[i];
150+
i++;
151+
}
152+
153+
else {
154+
if (d1.cards[i].compareTo(d2.cards[j]) <= 0) {
155+
result.cards[k] = d1.cards[i];
156+
i++;
157+
}
158+
159+
else if (d1.cards[i].compareTo(d2.cards[j]) > 0) {
160+
result.cards[k] = d2.cards[j];
161+
j++;
162+
}
163+
}
164+
}
165+
166+
return result;
130167
}
131168

132169
/**
133170
* Returns a sorted copy of the deck using merge sort.
134171
*/
135172
public Deck mergeSort() {
136-
return this;
173+
int middle;
174+
Deck d1;
175+
Deck d2;
176+
Deck result;
177+
178+
if (this.cards.length <= 1) {
179+
return this;
180+
}
181+
else {
182+
middle = this.cards.length/2;
183+
d1 = this.subdeck(0, middle-1);
184+
d1 = d1.mergeSort();
185+
d2 = this.subdeck(middle, this.cards.length - 1);
186+
d2 = d2.mergeSort();
187+
result = merge(d1, d2);
188+
return result;
189+
}
137190
}
138191

139192
/**
140193
* Reorders the cards (in place) using insertion sort.
141194
*/
142195
public void insertionSort() {
196+
if (this.cards.length > 1) {
197+
for (int i = 1; i < this.cards.length; i++) {
198+
for (int k = i; k > 0; k--) {
199+
if (this.cards[k].compareTo(this.cards[k-1]) < 0) {
200+
swapCards(k-1, k);
201+
}
202+
}
203+
}
204+
}
143205
}
144206

145207
}

0 commit comments

Comments
 (0)