1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Sắp xếp theo kiểu : Merge sort docx

4 688 2
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Merge Sort
Trường học University of Information Technology
Chuyên ngành Computer Science
Thể loại Bài tập lớn
Thành phố Ho Chi Minh City
Định dạng
Số trang 4
Dung lượng 31 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Kết quả C đã được merge và có thứ tự Giải thuật:cho trường hợp dùng list để chứa các phần tử cần sort Sortable_ List là một lớp list có đặc điểm là có hàm sort Node là một template class

Trang 1

sort

QUOTE

Neuyén tic :

VD taco

12 13 45 32 100 34 65 10

Ta có ở trên là § phần tử cần được sắp xếp :

Ý tưởng của merge sort là thay vì sắp xếp 8 phần tử (khó sắp ) thì ta chia đôi dãy đó ra làm đôi (số phân tử nhỏ hơn > sắp dễ hơn ) và sắp xếp các dãy con rồi ghép 2 dãy con lại ( gọi là merge 2 dãy con )

Vậy ta làm như sau:

Chia đôi > được hai dãy con mới là 12 13 45 32 va 100 34 65 10

sắp 2 dãy con lại : 12 13 45 32 gọi là dãy A

100 34 65 10 gọi là dãy B

+ Muốn sắp A ta cũng làm y như trên

Chia đôi A, được 2 dãy mới là AII = { 12 13 } A12 = {45 32 }

Chia đôi B được 2 dãy mới là B11 = {100 34} B12 = {65 10)

+ Sắp xếp A11, B11, A12, B12

+ Muốn sắp xếp A11 thì ta cũng chia đôi đến khi sắp được

ta có 2 dãy con là A21 = {12} A22 =({ 13}

Sắp 2 dãy con trên được ( đơn giản vì chỉ có một phần tử ) là A21 = £12 } A22 = {13}

Sắp xong thì ta merge lại thành A11 = ƒ 12 13 }

+ Tương tự sắp xếp cho B11 , A12, B12 ta cũng có

BII= {34 100} B12 = {10 65 } Al2 = {32 45 }

+Sắp xếp xong , ta sẽ merge lại A11 , A12 thành A = ƒ 12 13 32 45 }

B11, B12 thanh B = { 10 34 65 100 }

Sắp xong A , B, ta sẽ merge chúng lại thành dãy ban đâu :

{10 12 13 32 34 45 65 100 }

Trang 2

Phuong phap merge:

VD A= { 12 13 3245}

B= {1034 65 100)

Đầu tiên lây phân tử đầu tiên của A và B : 12 và 10

10 < 12 nên ta lây 10 bỏ vào mảng kết quả là C = {10}

Giử lại số 12, và lây tiếp phân tử thay thế 10 trong mảng B là 34

So sánh 12 và 34 12 < 34, lẫy 12 ra và bỏ vào C = {10 12}

Git lai 34 Lay phan tir ké tiép dé thay cho 12 trong mang A la 32

So sánh 32 và 34 chọn 32 bỏ vảo C = { 10 12 32 }

Đến bước cuối cùng A hết phần tử B còn lại B = ƒ 65 100}

Ta sẽ bỏ toàn bộ mảng B vào C Kết quả C đã được merge và có thứ tự

Giải thuật:(cho trường hợp dùng list để chứa các phần tử cần sort)

Sortable_ List là một lớp list có đặc điểm là có hàm sort

Node là một template class biêu diễn cho các node trong list

Record 1a class dung dé biéu dién data cần sắp xếp ( VD như sắp một dãy các số nguyên , hay

VD là sắp theo tên của các record bao gồm tên, tuổi , số điện thoại .)

sublist là list cần sắp xếp

CODE

Sortable List<Record>::recursive_merge_sort(Node<Record> *&sublist )

{

if( sublist != 0 && sublist->next != 0 } //tức là có tồn tại 2 node trở lên dé có thể chia đôi

sublist được

{

Node <Record > *second_half = divide_from (sublist);

Trang 3

recursive _merge_sort(sublist);

recursive _merge_sort(second_half);

sublist = merge(sublist, second_half)

Node<Record>* Sortable List <Record>::divide_from( Node<Record> *sublist)

{

Node<Record> *position , *midpoint , *second_half;

if (( midpoint = sublist) = NULL) return NULL; // hong co ds dé chia

position = midpoint->next;

while(position != 0)

position = position->next;

if ( position != 0)

{

midpoint = midpoint->next;

position = position->next;

// midpoint duyét 1 thì position duyệt 2 node cùng 1 lúc nên khi position kết thúc = NULL thì midpoInt cũng đang ở vị trí chính g1ữa;

}

}

second half = midpoint->next;

midpoint->next = NULL;

return second_half;

Node <Record> * merge(Node<Record> *first , Node<Record>* second )

{

Trang 4

Node<Record> *last_ sorted;

Node<Record> combined;

last_sorted = &combined;

while ( first != NULL && second != NULL )

{

if (first->entry <= second->entry ) { last_sortesorted->next = first; last_ sorted = first;

first = first->next;

}

else

{

last_sorted->next = second;

last_sorted = second;

second = second->next;

}

}

if ( first == NULL )

last_sorted->next = second;

else

last_sorted-> next = first ;

return combind.next

Ngày đăng: 12/12/2013, 20:15

TỪ KHÓA LIÊN QUAN

w