banner
 .::Others::. Merge sort Go to original post Author: LQV0604  - Translator:  - Entry Date: 13/02/2009 07:06:47
Merge sort

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
}

//

PS : Hàm merge này viết hay , không tạo ra một ds mới để chứa kết quả như ta trình bày ở VD mà chỉ dùng một ds các con trỏ (combined) để chỉ đến thứ tự các node ở trên cả hai first và second. Cách này có lợi nếu Record là một trường phức tạp .
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Other posts in the same group:

Merge sort
Go to top Go to original post  

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|