Sắp xếp nhanh¶
Yêu cầu¶
Sắp xếp một mảng số nguyên theo thứ tự tăng dần bằng thuật toán sắp xếp nhanh.
Input¶
Mảng A gồm n số nguyên.
Output¶
Mảng A có thứ tự tăng dần.
Bộ test¶
Input mẫu¶
Ouput mẫu¶
Thuật toán sắp xếp nhanh¶
Tương tự sắp xếp trộn, thuật toán sắp xếp nhanh cũng chia mảng thành hai mảng con trái và phải.
Nếu như sắp xếp trộn chia mảng dựa vào vị trí của phần tử giữa thì sắp xếp nhanh chia mảng dựa vào tiến trình phân hoạch (partition).
Phân hoạch là tiến trình chọn một phần tử trục (pivot) để phân chia mảng thành hai mảng con:
- Một mảng con chứa các phần tử nhỏ hơn hoặc bằng pivot.
- Một mảng con chứa các phần tử lớn hơn pivot.
Tiến trình phân hoạch được lặp lại cho đến khi mỗi mảng con chỉ còn một phần tử, đồng nghĩa không thể chia đôi được nữa.
Dựa theo ý tưởng trên, sắp xếp nhanh được mô tả theo kỹ thuật chia để trị như sau:
Thao tác chia
Được thể hiện ở chỗ: chia mảng ban đầu thành hai mảng con: trái và phải.
Cụ thể, chia bằng cách xác định vị trí của phần tử trục (pivot) và đặt các phần tử còn lại vào mảng con trái hoặc phải.
Phần tử trục có thể được chọn bằng nhiều cách:
- Chọn phần tử ở giữa mảng.
- Chọn phần tử ở cuối mảng.
- Chọn phần tử ở đầu mảng.
Thao tác trị
Được thể hiện ở hai chỗ:
- Trị đối với trường hợp cơ sở:
- Mảng chỉ còn một phần tử, không thể chia đôi được nữa.
- Trị đối với trường hợp tổng quát:
- Gọi đệ quy cho mảng con bên trái.
- Gọi đệ quy cho mảng con bên phải.
Lệnh gọi đệ quy vừa đóng vai trò "chia" vừa đóng vai trò "trị".
Thao tác kết hợp
Thao tác kết hợp không cần thiết vì các phần tử trong mỗi mảng con đã được sắp xếp theo thứ tự tăng dần.
Cách giải đề xuất¶
Hàm phân hoạch¶
Hàm partition()
dùng để phân hoạch mảng A
thành hai mảng con trái và phải.
Hàm này gồm ba tham số:
A
: mảng ban đầuleft
,`right
: là phạm vi của mảng cần phân hoạch.
Cách thức phân hoạch như sau:
Bước 0:
- Chọn phần tử trục (pivot) là phần tử cuối cùng của mảng.
- Khởi tạo biến
i
là chỉ số trước phần tử đầu tiên của mảng (left
).
Bước 1:
Duyệt qua các phần tử A[j]
trong phạm vi [left..right - 1]
, ứng với mỗi A[j]
:
- Nếu phần tử A[j]
nhỏ hơn hoặc bằng pivot
thì:
- Tăng chỉ số i
lên một đơn vị để mở rộng mảng con trái.
- Hoán vị phần tử A[i]
và A[j]
.
Sau vòng lặp này, các A[j]
nhỏ hơn hoặc bằng pivot
sẽ nằm trong đoạn [left..i]
và các A[j]
lớn hơn pivot
sẽ nằm trong đoạn [i+1..right-1]
.
Bước 2:
- Hoán vị phần tử
A[i + 1]
vàA[right]
. - Trả về chỉ số
i + 1
, là vị trí mới của phần tử trục.
Hàm sắp xếp nhanh¶
Hàm quick_sort()
dùng để sắp xếp mảng A
trong phạm vi [left..right]
.
In kết quả¶
Trong chương trình chính, ta gọi hàm quick_sort()
ra thực hiện.
Output:
Mã nguồn¶
Code đầy đủ được đặt tại:
Some English words¶
Vietnamese | Tiếng Anh |
---|---|
phân hoạch, phân vùng | partition |
sắp xếp nhanh | quick sort |