Tải bản đầy đủ (.doc) (4 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (58.19 KB, 4 trang )

sort
QUOTE
Nguyên tắc :
VD ta có
12 13 45 32 100 34 65 10
Ta có ở trên là 8 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 và 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à A11 = { 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ó
B11 = {34 100} B12 = {10 65 } A12 = {32 45 }
+Sắp xếp xong , ta sẽ merge lại A11 , A12 thành A = { 12 13 32 45 }
B11 , B12 thành 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 }
Phương pháp merge:
VD A = { 12 13 32 45 }
B = { 10 34 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}
Giử lại 34 . Lấy phần tử kế tiếp để thay cho 12 trong mảng A là 32
So sánh 32 và 34 chọn 32 bỏ vảo C = { 10 12 32 }
........ Làm tương tự ......
Đế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 là class dùng để 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 để có thể chia đôi
sublist được
{
Node <Record > *second_half = divide_from (sublist);
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; // hổng có ds để 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 giữa;
}
}
second_half = midpoint->next;
midpoint->next = NULL;
return second_half;
}
Node <Record> * merge(Node<Record> *first , Node<Record>* second )
{
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
}

×