Bài toán sắp xếp mảng bằng phương pháp trộn (Sort-Merge)

Một phần của tài liệu Giáo trình kỹ thuật lập trình C (Trang 25 - 26)

II. MỘT SỐ BÀI TOÁN GIẢI BẰNG GIẢI THUẬT ĐỆ QUY ĐIỂN HÌNH

4.Bài toán sắp xếp mảng bằng phương pháp trộn (Sort-Merge)

Ý tưởng : Để sắp xếp 1 danh sách gồm n phần tử bằng phương pháp trộn người ta chia danh sách thành 2 phần (tổng quát là nhiều phần ) , sắp xếp từng phần, rồi trộn chúng .

Bài toán : sắp theo thứ tự không giảm mảng a : VectorT bằng phương pháp trộn. ( VectorT = array[1 . . size] of T).

a) Thông số hoá:

Bài toán được khái quát thành sắp xếp một dãy con của dãy V : VectorT từ chỉ số m đến chỉ số n với 1 <= m <= n <= size . Ta đặt tên cho bài toán ở dạng tổng quát là : SM(V,m,n).

Bài toán ban đầu : sắp dãy A sẻ được thực hiện bằng lời gọi : SM(A ,1,size).

b) Trường hợp tầm thường:

Đó là khi n = m (dãy sắp chỉ có 1 phần tử ), khi đó không cần làm gì cả (thao tác rỗng) .

Kỹ thuật lập trình nâng cao - 25 -

c) Phân rã trường hợp tổng quát :

Khi n > m ta thực hiện các công việc sau :

+ Chia dãy : a[m] ,a[m+1], . . . , a[n] thành 2 dãy con a[m] , . . , a[l] và a[l+1] , . . . , a[n]

+ Sắp xếp từng dãy con thành các dãy có thứ tự theo giải thuật SM . + Trộn 2 dãy con có thứ tự lại thành dãy a[m] ,. . . , a[n] mới có thứ tự . Để thực hiện việc trộn hai dãy có thứ tự thành một dãy có thứ tự ta sẽ dùng một thủ tục không đệ quy Merge(m , l , n) . Ta cần chọn l để được 2 dãy con giảm hẵn kích thước so với dãy ban đầu , tức là chọn l : m < l < l+1 < n .

Thương chọn l là phần tử “giữa “ : l = ( m + n ) div 2 .

Thủ tục Sort_Merge(m,n) trên mảng V : VectorT viết trên ngôn ngữ PASCAL có dạng :

procedure SM (var d: VectorT ; m,n: index); var l : index ; begin if n>m then begin l := (m+n) div 2; SM (d,m,l) ; SM (d,l+1,n) ; Merge (d,m,l,n) ; end ; end ;

Trong đó SM là thủ tục trộn 2 dãy tăng để được một dãy tăng. Để sắp mảng A (dãy A[1:size]) ta gọi SM(A ,1,size)

Một phần của tài liệu Giáo trình kỹ thuật lập trình C (Trang 25 - 26)