So sánh từng cặp liền nhau theo thứ tự tăng dần tính từ đầu dãy, nếu không đúng thứ tự sắp xếp thì đổi chỗ.. Nếu trong lần duyệt thứ n qua dãy, có một lần đổi chỗ đã thực hiện thì lặp lạ
Trang 1These slides are adapted from slides provided with Data Structures and Algorithms in C++
Goodrich, Tamassia and Mount (Wiley, 2004)
Trang 2Một số giải thuật sắp xếp
Sắp xếp nổi bọt (Bubble Sort)
Sắp xếp xen vào (Insertion Sort)
Sắp xếp hòa nhập (Merge Sort)
Sắp xếp nhanh (Quick Sort)
Trang 3Sorting 3
Sắp xếp nổi bọt
Thuật toán
1 So sánh từng cặp liền nhau theo thứ tự tăng
dần tính từ đầu dãy, nếu không đúng thứ tự sắp xếp thì đổi chỗ.
2 Nếu trong lần duyệt thứ n qua dãy, có một
lần đổi chỗ đã thực hiện thì lặp lại bước 1.
Reference: http://www.algolist.net/Algorithms/Sorting/Bubble_sort
Trang 5Sorting 5
Giả mã
Input dãy S có n ph ần tử, toán tử so sánh C
do
swapped ← false
for each i in 1 to length(S) – 1 inclusive do:
if S[i - 1] > S[i] according to C then
swap(S[i - 1], S[i]) swapped ← true
Trang 7Sorting 7
Tính hiệu quả, thời gian thực thi
Trường hợp xấu nhất và trung bình: O(n 2 )
Trường hợp tốt nhất: (dãy đầu vào đã sắp
xếp) :O(n)
Trang 8Sắp xếp xen vào
Trang 10Giả mã
Input dãy S có n ph ần tử, toán tử so sánh C
for i from 1 to length(S) do
j ← i
while j > 0 && S[j - 1] > S[j] then
swap(S[j - 1], S[j]) j
Trang 11Sorting 11
Tính hiệu quả, thời gian thực thi
Trường hợp xấu nhất và Trung bình: O(n2)
Trường hợp tốt nhất: (dãy đã sắp xếp sẵn) :O(n)
Tính phụ thuộc (hiệu năng tùy thuộc thứ tự ban đầu của dãy);
Tính ổn định (giữ lại vị trí tương đối của các phần tử giống nhau);
Tính tại chỗ (không gian cần cho thuật toán là không đổi);
Trực tuyến (có thể thêm phần tử vào dãy trong khi
đang sắp xếp).
Trang 12Chia - đ ể - Trị
Chia đ ể trị (Divide-and conquer) là m ột mô hình tổng quát đ ể thiết kế thuật toán :
Chia(Divide) : chia d ữ liệu vào S thành
2 hay nhi ều tập con rời nhau S1, S2, …
Recur : gi ải các trường hợp
nh ỏ hơn bằng đệ quy
Tr ị(Conquer) : k ết hợp các đáp án của S1, S2, …, thành m ột đáp án thống nhất của S
Trư ờng hợp cơ sở của các thủ tục đệ quy là tập con
c ủa S mà có kích thước hằng
Vi ệc phân tích có thể thực hiện bằng recurrence equations
Trang 13S ắp xếp hòa nhập
7 2 9 4 → 2 4 7 9
7 2 → 2 7 9 4 → 4 9
7 → 7 2 → 2 9 → 9 4 → 4
Trang 14S ắp xếp hòa nhập(Merge-Sort)
Thu ật toán Sắp xếp hòa nhập
(Merge-sort) v ới 1 dãy S có n
ph ần tử bao gồm 3 bước :
thành hai dãy con S1 , S2 v ới
Trang 15c ủa hai dãy con
Ghép hai dãy con đã
s ắp xếp, mỗi dãy có n/2
ph ần tử và được biểu
di ễn trong một danh
sách liên k ết đôi, thời
gian th ực thi là O(n)
Trang 16Sơ đ ồ thuật toán
Quá trình thu ật toán sắp xếp hòa nhập(Merge-Sort) có thể biểu
di ễn bằng cây nhị phân
Các đ ỉnh biểu diễn việc tiến hành thủ tục đệ quy khi sắp xếp
và là nơi lưu gi ữ
Một dãy khi chưa sắp xếp và các dãy con của nó
Dãy đã sắp xếp sau khi thực thi thuật toán
G ốc là dãy ban đâu, mang lời gọi đệ quy đầu tiên
Các lá là dãy con có đ ộ dài là 0 hoặc 1
7 2 9 4 → 2 4 7 9
7 2 → 2 7 9 4 → 4 9
Trang 27Sorting 27
Độ cao h của cây nhị phân biểu diễn quá trình sắp xếp là O(log n)
Mỗi lần tiến hành thủ tục đệ quy ta lại chia đôi dãy
Khối lượng công việc cần thực hiện tại đỉnh mức i là O(n)
Phân chia và ghép lại 2i dãy con có độ dài n////2 i
Tiến hành thủ tục đệ quy 2i+1 lần
Do đó thời gian cần thiết để thực thi thuật toán làO(n log n)
depth #seqs size
1 2 n////2
i 2i n////2 i
… … …
Trang 28Phân tích Merge-Sort s ử dụng
• Merge(S1,S2) c ần thời gian
th ực hiện O(n), với n là độ
Trang 30S ắp xếp nhanh(Quick-Sort)
x ếp ngẫu nhiên sử dụng mô
Trang 31Sorting 31
Phân chia
Chia dãy đã cho thành 2 dãy
con theo cách sau:
Mỗi hành động xóa hoặc chèn
thêm phân tử vào dãy thực
hiện ở đầu hoặc cuối dãy, cần
thời gian O(1)
Do đó, việc phân chia dãy cần
thời gian O(n)
else if y = x E.insertLast(y)
else { y > x }
G.insertLast(y)
Trang 32Sơ đ ồ thuật toán
Ho ạt động của thuật toán Sắp xếp nhanh(Quick-Sort) có thể mô
t ả bằng cây nhị phân
M ỗi đỉnh biểu diễn một hành động đệ quy gọi thủ tục Sắp
x ếp nhanh(Quick-Sort) và lưu giữ
Dãy chưa sắp xếp và phần tử chốt của nó
Dãy đã sắp xếp sau khi thủ tục tiến hành xong
G ốc là nơi mang lời gọi thủ tục đệ quy đầu tiên
Các lá là nơi có dãy đ ộ dài 0 hoặc 1
7 4 9 6 2 → 2 4 6 7 9
4 2 → 2 4 7 9 → → 7 9
Trang 40Th ời gian thực thi trong
Trư ờng hợp xấu nhất xảy ra khi phần tử chốt được chọn là phần
t ử nhỏ nhất hoặc lớn nhất trong dãy
M ột trong hai dãy L và G có độ dài n − 1, dãy còn lại có độ dài 0
Th ời gian thực thi tỷ lệ thuận với tổng
Trang 41Sorting 41
Thực hiện gọi thủ tục đệ quy Quick-Sort với dãy đầu vào có độ dài s
G ọọọọi tốốốốt (good call) : độ dài của L và G đều nhỏ hơn 3s/4
G ọọọọi không tốốốốt (bad call) : độ dài của L hoặc G lớn hơn 3s/4
Trang 42Ư ớc lượng thời gian (tiếp)
Xác suất thực tế: giả sử chúng ta gieo đồng xu, để có k lần mặt ngửa thì
số lần cần gieo đồng xu là 2k
Với đỉnh ở mức i, chúng ta mong muốn rằng:
Kich thước của dãy đầu vào cho thủ tục đệ quy hiện tại gần với
Do đó, chúng ta trông đợi rằng:
Với đỉnh ở mức 2log4/3n, kích
thước dãy đầu vào là 1
Chiều cao của cây sắp
xếp(Quick sort) là O(log n)
Lượng công việc càn làm ở các đỉnh
cùng mức là O(n)
Do đó, chúng ta hy vọng thời gian
thực thi thuật toán là O(n log n)
Trang 43Sorting 43
Quick-sort có thể được cài đặt để chạy
ngay trên dãy, không tạo ra dãy
con(chạy tại chỗ)
Ở bước phân chia dãy, đổi chỗ các
phần thử trong dãy dự theo kết quả
so sanh để phân bố lại dãy
Output sequence S with the
elements of rank between l and r
rearranged in increasing order
Trang 44Phân chia t ại chỗ
S ử dụng hai chỉ số để chia S thành hai dãy L và EΥG (một cách tương t ự để chia EΥG thành E và G).
L ặp lại cho đến khi j and k thỏa mãn:
D ịch chuyển j về bên phải cho đến khi thấy phần tử > x.
D ịch chuyển k về bên trái cho đến khi thấy phần tử < x.
Trang 45Sorting 45
bubble-sort O(n2) tại chỗ
ch ậm (phù hợp với đầu vào nhỏ)
insertion-sort O(n2) tại chỗ
heap-sort O(n log n) tại chỗ
nhanh (phù h ợp đầu vào lớn)
merge-sort O(n log n) truy cập dữ liệu tuần tự
nhanh (phù h ợp đầu vào rất lớn)