Phân loại thuật toán sắp
xếp
v Sắp xếp ổn định
Một thuật toán sắp xếp được gọi là sắp xếp ổn định nếu sau khi tiến hành
sắp xếp vị trí tương đối giữa các phần tử bằng nhau không bị thay đổi.
v Sắp xếp so sánh
Một thuật toán sắp xếp được gọi là sắp xếp so sánh nếu trong quá trình
thực hiện thuật toán ta tiến hành so sánh các khoá và đổi chỗ các phần tử cho
nhau. Đa số các thuật toán sắp xếp dưới đây là sắp xếp so sánh, riêng sắp xếp đếm
phân phối không phải là sắp xếp so sánh.
Một số thuật
toán sắp xếp
Ø Sắp xếp nổi bọt
Sắp xếp nổi bọt (bubble sort)
là phương pháp sắp xếp đơn
giản, dễ hiểu thường được dạy trong khoa học máy tính. Giải thuật bắt đầu từ đầu
của tập dữ liệu. Nó so sánh hai phần tử đầu, nếu phần tử đứng trước lớn hơn phần
tử đứng sau thì đổi chỗ chúng cho nhau. Tiếp tục làm như vậy với cặp phần tử tiếp
theo cho đến cuối tập hợp dữ liệu. Sau đó nó quay lại với hai phần tử đầu cho đến
khi không còn cần phải đổi chỗ nữa.
Ø Sắp xếp chèn
Sắp xếp chèn (insertion sort)
là thuật toán sắp xếp xử
lý chèn phần tử đang xét vào vị trí thích hợp của dãy số đã sắp xếp phía trước
sao cho dãy số vẫn là dãy sắp xếp có thứ tự.
Code:
Ø Sắp xếp chọn
Sắp xếp chọn (selection sort)
là phương pháp sắp xếp bằng
cách chọn phần tử bé nhất xếp vào vị trí thứ nhất, tương tự với các phần tử nhỏ
thứ hai, thứ ba,...
Ø Sắp xếp trộn
Sắp xếp trộn (merge sort)
cùng với sắp xếp nhanh là hai thuật toán sắp xếp
dựa vào tư tưởng "chia để trị" (divide and conquer). Thủ tục
cơ bản là việc trộn hai danh sách đã được sắp xếp vào một danh sách mới theo thứ
tự. Nó có thể bắt đầu trộn bằng cách so sánh hai phần tử một (chẳng hạn phần tử
thứ nhất với phần tử thứ hai, sau đó thứ ba với thứ tư...) và sau khi kết thúc
bước 1 nó chuyển sang bước 2. Ở bước 2 nó trộn các danh sách hai phần tử thành
các danh sách bốn phần tử. Cứ như vậy cho đến khi hai danh sách cuối cùng được
trộn thành một.
Ø Sắp xếp vun đống
Sắp xếp vun đống (heapsort)
là một trong các phương pháp sắp xếp chọn. Ở mỗi bước của
sắp xếp chọn ta chọn phần tử lớn nhất (hoặc nhỏ nhất) đặt vào cuối (hoặc đầu)
danh sách, sau đó tiếp tục với phần còn lại của danh sách. Thông thường sắp xếp
chọn chạy trong thời gian O(n2). Nhưng heapsort
đã giảm độ phức tạp này bằng cách sử dụng một cấu trúc dữ liệu đặc biệt được gọi
là đống (heap).
Đống là cây nhị phân mà trọng số ở mỗi đỉnh cha lớn hơn hoặc bằng trọng số các
đỉnh con của nó. Một khi danh sách dữ liệu đã được vun thành đống, gốc của nó là
phần tử lớn nhất, thuật toán sẽ giải phóng nó khỏi đống để đặt vào cuối danh
sách. Sắp xếp vun đống chạy trong thời gian O(n log n).
Ø Sắp xếp nhanh
Sắp xếp nhanh (quicksort)
là
một thuật toán theo tư tưởng chia để trị, nó dựa trên thủ
tục phân chia như sau: để chia một dãy ta chọn một phần tử được gọi là
"chốt" (pivot), chuyển tất cả các phần tử nhỏ hơn chốt về
trước chốt, chuyển tất cả các phần tử lớn hơn chốt về sau nó(nếu sắp xếp theo
dãy theo thứ tự tăng dần), nếu sắp xếp dãy theo thứ tự giảm dần ta chuyển tất
cả các phần tử nhỏ hơn chốt về bên phải chốt và lớn hơn chốt về bên trái chốt.
Thủ tục này có thể thực hiện trong thời gian tuyến tính. Tiếp tục phân chia các
dãy con đó như trên cho đến khi các dãy con chỉ còn một phần tử.
Điểm khác biệt giữa sắp xếp nhanh và sắp xếp trộn là trong sắp xếp
trộn việc xác định thứ tự được xác định khi "trộn", tức là trong khâu
tổng hợp lời giải sau khi các bài toán con đã được giải, còn sắp xếp nhanh đã
quan tâm đến thứ tự các phần tử khi phân chia một danh sách thành hai danh sách
con.
Ø Sắp xếp theo cơ số
Sắp xếp theo cơ số (radix
sort) dựa trên tính chất "số" của các khóa. Trong giải thuật
sắp xếp theo cơ số, ta không chỉ so sánh giá trị của các khóa, mà so sánh các
thành phần của khóa. Giả sử các khóa là các số biểu diễn theo hệ ghi số cơ số
M. Khi đó sắp xếp theo cơ số sẽ so sánh từng k
Chúng ta mô tả cách sắp này khi cơ số M=10. Giả sử phải sắp các hồ
sơ đánh số bởi 3 chữ số thập phân. Đầu tiên ta chia các hồ sơ vào các đống có
cùng chữ số hàng trăm (đồng thới xếp các đống theo thứ tự của chữ số hàng
trăm), trong mỗi đống con lại phân chia theo chữ số hàng chục, cuối cùng trong
mỗi đống có cùng chữ số hàng trăm và hàng chục, sắp xếp theo thứ tự của chữ số
hàng đơn vị.
Trong máy tính, đương nhiên việc sắp xếp theo cơ số nhị phân (cơ số 2) hoặc
cơ số là lũy thừa của 2 là thuận lợi nhất. Trong trường hợp cơ số 2, việc phân
hoạch tương tự như phân hoạch trong Quick Sort, chỉ khác ở chỗ cách chọn phần
tử chốt.
Ø Sắp xếp đếm phân phối
Sắp xếp đếm phân phối là phương pháp sắp
xếp có độ phức tạp tuyến tính trong trường hợp các khóa nhận hữu hạn giá trị
trong khoảng cho trước. Để đơn giản ta giả sử các phần tử của danh sách nhận các giá trị tự nhiên trong khoảng a[1…n] [1..M]
Sắp xếp đếm phân phối đầu tiên đếm các phần tử thuộc danh sách nhận
giá trị k với . Các giá trị đếm được ghi vào mảng Counter[1..M]. 1 <= K
<= MSau đó khi duyệt theo k từ 1 đến M,
ta lần lượt xếp Counter[k] phần tử
của vào danh sách . a[1..n]
Ø Shell Sort
Shell sort là một giải thuật
sắp xếp mang lại hiệu quả cao dựa trên giải thuật sắp sếp chèn (Insertion
Sort). Giải thuật này tránh được các trường hợp phải tráo đổi vị trí của hai
phần tử xa nhau trong giải thuật sắp sếp chọn. (nếu như phần tử nhỏ hơn ở vị
trí bên phải khá xa so với phần tử lớn hơn ở vị trí bên trái)