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 1sort
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 2Phuong 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 3recursive _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 4Node<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