Sắp xếp theo kiểu : Merge sort

Chia sẻ: Đặng Quang Hưng | Ngày: | Loại File: DOC | Số trang:4

0
362
lượt xem
65
download

Sắp xếp theo kiểu : Merge sort

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Ý 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 )

Chủ đề:
Lưu

Nội dung Text: Sắp xếp theo kiểu : Merge sort

  1. 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 }
  2. 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::recursive_merge_sort(Node *&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 *second_half = divide_from (sublist);
  3. recursive_merge_sort(sublist); recursive_merge_sort(second_half); sublist = merge(sublist, second_half) } } Node* Sortable_List ::divide_from( Node *sublist) { Node *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 * merge(Node *first , Node* second ) {
  4. Node *last_sorted; Node combined; last_sorted = &combined; while ( first != NULL && second != NULL ) { if (first->entry 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 bộ tài khoản