11import java .util .Arrays ;
22import 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