Giải thuật sắp xếp hòa nhập bốn đường
Trang 1Giải thuật sắp xếp hoà nhập bốn đường
Võ Công Chương
Có nhiều phương pháp sắp xếp Song, tùy thuộc vào sự tổ chức của dữ liệu, người ta chọn phương pháp sắp xếp sao cho phù hợp Dưới đây, tôi xin chia sẻ với bạn đọc phương pháp sắp xếp hòa nhập bốn đường (4-Way Mergesort) trên mảng 2 chiều.
1 Thiết kế giải thuật
Định nghĩa:
Một mảng 2 chiều mxn gọi là mảng sắp xếp thô (roughly sorted) nếu ta chỉ cần sắp xếp các dòng của nó thì toàn bộ mảng sẽ được sắp xếp hoàn toàn
Vậy, trong mảng sắp xếp thô, mỗi phần tử của mảng đã nằm đúng trên dòng của nó
Ví dụ 1:
ý tưởng của sắp xếp hòa nhập bốn đường là hòa nhập bốn mảng sắp xếp thô m/2xn/2 lại
với nhau để được một mảng sắp xếp thô mxn (ở đây, ta mặc định là sắp tăng dần)
Procedure Four_Way_Merge (m, n)
Dữ liệu vào:
Mảng mxn thỏa mãn bốn mảng con m/2xn/2 của nó là sắp xếp thô.
Dữ liệu ra:
Mảng sắp xếp thô mxn.
Các bước thực hiện:
B1 Sắp xếp các dòng của bốn mảng con theo cách:
- Sắp xếp giảm dần với mảng con có chỉ số nhỏ hơn,
- Sắp xếp tăng dần với mảng con có chỉ số lớn hơn
B2 Sắp xếp tăng dần các cột của mảng mxn
B3 Sắp xếp các dòng của mảng mxn theo cách:
- Dòng lẻ thì sắp xếp tăng dần,
- Dòng chẵn thì sắp xếp giảm dần
B4 Sắp xếp tăng dần các cột của mảng mxn
Ví dụ 2:
Với m =5 và n =5, mỗi mảng con sắp xếp thô có kích thước là 2x2 Các bước thực hiện
giải thuật như sau:
Trang 2Hình 2: a) Mảng ban đầu có 4 mảng con sắp xếp thô.
b) Mảng có được sau bước 1.
c) Mảng có được sau bước 2.
d) Mảng có được sau bước 3.
e) Mảng có được sau bước 4 Đây là mảng sắp xếp thô.
f) Mảng đã được sắp xếp hoàn toàn sau khi sắp xếp các dòng.
Minh họa trên cũng cho chúng ta thấy được sự đúng đắn của giải thuật (phần chứng minh tính đúng đắn xin dành cho các bạn)
Để có được các mảng con sắp xếp thô từ một mảng ban đầu chưa sắp xếp, ta nên dùng chiến lược chia để trị với kĩ thuật đệ quy
Procedure Rough_Sort (m, n)
Dữ liệu vào:
Mảng mxn chưa sắp xếp
Dữ liệu ra:
Mảng mxn sắp xếp thô
Các bước thực hiện:
if m > 1 then
begin
B1 Gọi Rough_Sort (m/2,n/2) cho bốn mảng con;
B2 Gọi Four_Way_Merge (m, n);
end;
Vậy, một mảng mxn được sắp xếp hoàn toàn bằng cách làm cho nó trở thành mảng sắp xếp thô và rồi sắp xếp các dòng của nó
Procedure Four_Way_ Mergesort (n)
Dữ liệu vào:
Mảng mxn chưa sắp xếp
Trang 3Dữ liệura:
Mảng mxn đã được sắp xếp
Các bước thực hiện:
B1 Gọi Rough_Sort (m, n)
B2 Sắp xếp các dòng của mảng sắp xếp thô mxn
2 Phân tích giải thuật
Ta thử phân tích độ phức tạp của giải thuật khi sắp xếp một mảng nxn.
Ta có thể sắp xếp mỗi một dòng n phần tử theo phương pháp sắp xếp nổi bọt Vậy, như bạn đã biết, trong trường hợp xấu nhất ta phải mất thời gian là n(n-1)/2 Gọi việc sắp xếp một dòng hay một cột là một bước sắp xếp thì việc sắp xếp n dòng hoặc n cột của mảng nxn phải mất n bước Trong thủ tục Four_Way_Merge, số lượng các bước là:
B1: n/2 bước
B2: n bước
B3: n bước
B4: n/2 bước
Tổng: 3n bước.
Chú ý rằng, B4 chỉ cần n/2 bước bởi vì mỗi cột đã được chia thành 2 phần (trên và dưới)
bởi 4 mảng con ban đầu, nên ta chỉ cần sắp xếp trong nội bộ 2 phần của mỗi cột đó
Việc gọi đệ quy Four_Way_Merge trong Rough_Sort mất 3n+3n/2+3n/4+…+3 ≤ 6n bước Do vậy, cộng thêm việc sắp xếp các dòng của mảng nxn trong
Four_Way_Mergesort ta có tổng thời gian của giải thuật là: T(n)≤7n bước Mỗi bước mất thời gian ít nhất là n(n-1)/2 nên T(n) ≤7n2(n-1)/2 Với kích thước của mảng hai chiều là
nxn thì độ phức tạp tính toán của giải thuật là: O(n3/2)
3 Kết luận
Đến đây, bạn đã biết được giải thuật sắp xếp hòa nhập bốn đường là gì Độ phức tạp của
nó là chấp nhận được, cụ thể là O(n3/2) Bạn cũng sẽ biết cách cài đặt giải thuật này một
khi bạn muốn sắp xếp một mảng 2 chiều