THINK JAVA: CÁCH SUY NGHĨ NHƯ NHÀ KHOA HỌC MÁY TÍNH - Trang 136

K t qu ta s đ

c m t ph n bài chung đ

c x p đúng. Sau đây là cách làm b ng gi mã:

ế

ẽ ượ

ượ ế

public static

Deck merge(Deck d1, Deck d2) {

// tạo nên một cỗ bài đủ lớn chứa hết các quân bài

Deck result =

new

Deck(d1.cards.length + d2.cards.length);

// dùng chỉ số i để theo dõi vị trí hiện tại trên

// phần bài thứ nhất, và chỉ số j cho phần bài thứ hai

int

i = 0;

int

j = 0;

// chỉ số k duyệt theo phần bài được xếp đúng

for

(

int

k = 0; k < result.cards.length; k++) {

// nếu d1 rỗng thì d2 thắng; nếu d2 rỗng, d1 thắng;

// nếu không, đi so sánh hai lá bài

// thêm lá bài thắng vào phần bài được xếp đúng

}

return

result;

}

Cách hay nh t đ ki m tra

ấ ể ể

merge là l p nên và tr n m t c bài, dùng ph

ng th c subdeck đ hình

ộ ỗ

ươ

thành nên hai ph n bài (nh ), r i dùng th t c sort t ch

ng tr

c đ s p x p hai n a. Sau đó b n có

ỏ ồ

ủ ụ

ừ ươ

ướ ể ắ

ế

th truy n hai n a này vào

merge đ xem ph

ng th c m i này có ho t đ ng không.

ươ

ạ ộ

N u b n có th làm cho m i th nh trên ho t đ ng đ

c, hãy th m t phiên b n

ế

ư

ạ ộ

ượ

ử ộ

ả mergeSort đ n gi n:

ơ

public static

Deck mergeSort(Deck deck) {

// tìm điểm giữa của cỗ bài

// chia cỗ bài thành hai phần nhỏ

// xếp phần nhỏ bằng sortDeck

// trộn hai nửa rồi trả lại kết quả

}

Sau đó, n u nh b n làm cho ph

ng th c ho t đ ng đ

c, s có cái hay! Đi u kì di u v s p x p tr n

ế

ư ạ

ươ

ạ ộ

ượ

ề ắ

ế

là nó có tính đ quy. lúc mà b n b t đ u s p x p các ph n bài, t i sao ph i kích ho t ph

ng

ắ ầ ắ

ế

ươ

th c

ứ sort cũ và ch m ch p? Sao không kích ho t ph ng th c

ươ

ứ mergeSort m i toanh, đang đ c vi t?

ượ

ế

Đây không ch là m t ý t

ng t t, mà

ưở

c n thi t

ế ph i đ t đ c u th v hi u năng c a ch ng trình mà

ả ạ ượ ư

ế ề ệ

ươ

tôi đã h a. Nh ng đ ch

ng trình ho t đ ng, b n c n ph i có m t tr

ng h p c s . N u không, đ

ư

ể ươ

ạ ộ

ạ ầ

ườ

ợ ơ ở ế

quy s mãi mãi. M t tr

ng h p c s đ n gi n là m t ph n bài v i 0 ho c 1 lá bài. N u

ườ

ợ ơ ở ơ

ế

nh

ư mergesort nh n đ c m t ph n bài nh nh v y, thì nó có th tr l i k t qu y nguyên, b i ph n

ượ

ư ậ

ể ả ạ ế

bài nh này đã đ

c s p x p.

ượ ắ

ế

Phiên b n đ quy c a

ủ mergesort có th s trông nh sau:

ể ẽ

ư

public static

Deck mergeSort(Deck deck) {

// nếu cỗ bài chỉ gồm 0 hoặc 1 lá bài, thì trả lại nó

// tìm ra điểm giữa của cỗ bài

// chia cỗ bài thành hai phần bài

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.