tài liệu uy tín được biên soạn bởi giảng viên đại học Bách Khoa TPHCM, thuận lợi cho qua trình tự học, nghiên cứu bộ tự động hóa, điện tử, cơ điện tử, cơ khí chế tạo máy, lập trình nhúng, Tài liệu được kiểm duyệt bởi giảng viên, phòng đào tạo trường đại học bách khoa, lưu hành nội bộ
Trang 1Chương 6 Sắp thứ tự
Trang 3 Sắp thứ tự các phần tử a1, a2, …, an là
hoán vị các phần tử này thành một dãy ak1,
ak2, …, akn sao cho với một hàm thứ tự f cho trước sẽ thỏa mãn:
f(ak1) α f(ak2) α … α f(akn) trong đó quan hệ α là một quan hệ thứ tự
toàn phần.
Định nghĩa sắp thứ tự
Trang 4 Sắp thứ tự nội
f internal sorting
đưa vào trong bộ nhớ chính.
Sắp thứ tự ngoại
f external sorting
vào trong bộ nhớ chính, phần dữ liệu còn lại được lưu trữ trên bộ nhớ ngoài.
f Còn được gọi là sắp thứ tự tập tin.
Phân loại sắp thứ tự
Trang 5 Các phương pháp xen vào (Insertion)
f Xen vào trực tiếp (Straight Insertion)
Các phương pháp chọn lựa (Selection)
f Chọn lựa trực tiếp (Straight Selection)
Các phương pháp đổi chỗ (Exchange)
f Nổi bọt (Bubble Sort)
Các phương pháp sắp thứ tự nội
Trang 6 Phương pháp
f Bước 1: Cho i = 2
f Bước 2: Xét dãy đã có thứ tự tăng dần a 1 , a 2 ,
…, a i-1 Xen a i vào dãy này sao cho dãy sau khi xen vào có thứ tự tăng dần.
f Bước 3: Cho i tăng lên 1 Nếu i > n thì kết
thúc, ngược lại đến Bước 2.
Phương pháp xen vào trực tiếp
Trang 8var a: array [0 n] of integer;
end end ;
Phương pháp xen vào trực tiếp
Trang 9Phương pháp chọn lựa trực tiếp
Phương pháp
f Bước 1: Cho i = 1
f Bước 2: Xét dãy a i , a 2 , …, a n Tìm a k nhỏ nhất
trong dãy này; đổi chỗ a i với a k
f Bước 3: Cho i tăng lên 1 Nếu i = n thì kết
thúc, ngược lại đến Bước 2.
Trang 10Phương pháp chọn lựa trực tiếp
Trang 11var a: array [1 n] of integer;
Phương pháp chọn lựa trực tiếp
Trang 12f Bước 2: Xét từ cuối dãy a i , a 2 , …, a n về đầu
dãy: nếu a j-1 > a j thì đổi chỗ a j-1 với a j
f Bước 3: Cho i tăng lên 1 Nếu i = n thì kết
thúc, ngược lại đến Bước 2.
Trang 15Phương pháp nổi bọt
Phương pháp nổi bọt có cờ
f Bước 1: Cho flag = true và k = 1
f Bước 2: Cho flag = false Xét từ đầu dãy a 1 ,
a 2 , …, a n-k về cuối dãy: nếu a i > a i+1 thì đổi chỗ
a i với a i+1 và cho flag = true.
f Bước 3: Cho k tăng lên 1 Nếu flag = false thì
kết thúc, ngược lại đến Bước 2.
Trang 18f Bước 3: Cho i chạy từ đầu dãy và j chạy từ
cuối dãy Phân chia a q , …, a r sao cho dãy a q ,
…, a j ≤ x và dãy a i , …, a r ≥ x bằng cách hoán
đổi a i ( ≥ x) với a j ( ≤ x).
f Bước 4: Nếu q < j thì cho r = j và đến Bước 2
Nếu i < r thì cho q = i và đến Bước 2.
Trang 20f Đối với dãy a 1 , a 2 ,…, a n thì dãy con a j , a j+1 ,…,
a n với j = [n / 2] + 1 được xem là một đống.
a k
a 2k+1
a 2k
Trang 29i := q; j := 2 * i; x := a[i]; cont := true;
while (j <= r) and cont do
begin
if j < r then
if a[j] > a[j+1] then j := j + 1;
if x <= a[j] then cont := false
else begin
a[i] := a[j]; i := j; j := 2 * i
end end ;
a[i] := x
end ;