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ộ
Chương Sắp thứ tự Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT Nội dung Ðịnh nghĩa thứ tự Phân loại thứ tự Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT Định nghĩa thứ tự Sắp thứ tự phần tử a1, a2, …, an hoán vị phần tử thành dãy ak1, ak2, …, akn cho với hàm thứ tự f cho trước thỏa mãn: f(ak1) α f(ak2) α … α f(akn) quan hệ α quan hệ thứ tự toàn phần Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT Phân loại thứ tự Sắp thứ tự nội f internal sorting f Toàn liệu cần thứ tự phải đưa vào nhớ f Còn gọi thứ tự mảng Sắp thứ tự ngoại f external sorting f Một phần liệu cần thứ tự đưa vào nhớ chính, phần liệu lại lưu trữ nhớ ngồi f Còn gọi thứ tự tập tin Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT Các phương pháp thứ tự nội Các phương pháp xen vào (Insertion) f Xen vào trực tiếp (Straight Insertion) f Xen vào nhị phân (Binary Insertion) Các phương pháp chọn lựa (Selection) f Chọn lựa trực tiếp (Straight Selection) f Sắp thứ tự theo đống (Heap Sort) Các phương pháp đổi chỗ (Exchange) f Nổi bọt (Bubble Sort) f Sắp thứ tự nhanh (Quick Sort) Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT Phương pháp xen vào trực tiếp Phương pháp f Bước 1: Cho i = f Bước 2: Xét dãy có thứ tự tăng dần a1, a2, …, ai-1 Xen vào dãy cho dãy sau xen vào có thứ tự tăng dần f Bước 3: Cho i tăng lên Nếu i > n kết thúc, ngược lại đến Bước Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT Phương pháp xen vào trực tiếp Ví dụ (i=2) (i=3) (i=4) (i=5) (i=6) (i=7) (i=8) (i=9) Chương Sắp thứ tự 5• •5 2• 2 •2 1 7 3 3• 2 2 5 3 3 3 7• 7• 4 9 9 9 5• 8 8 8 2006 4 4 4 8 1 1 1 1 9 6 6 6 6 Nguyễn Trung Trực - Khoa CNTT Phương pháp xen vào trực tiếp var a: array [0 n] of integer; procedure Straight_Insertion; var i, j, x: integer; begin for i := to n begin x := a[i]; a[0] := x; j := i - 1; while x < a[j] begin a[j + 1] := a[j]; j := j – end; a[j + 1] := x end end; Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT Phương pháp chọn lựa trực tiếp Phương pháp f Bước 1: Cho i = f Bước 2: Xét dãy ai, a2, …, an Tìm ak nhỏ dãy này; đổi chỗ với ak f Bước 3: Cho i tăng lên Nếu i = n kết thúc, ngược lại đến Bước Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT Phương pháp chọn lựa trực tiếp Ví dụ (i=1) (i=2) (i=3) (i=4) (i=5) (i=6) (i=7) (i=8) Chương Sắp thứ tự 5 1 1 1 1 7 2 2 2 2 3 3 3 3 3 4 4 9 9 9 5 5 8 8 8 6 2006 4 4 7 7 1 5 5 9 9 6 6 6 8 Nguyễn Trung Trực - Khoa CNTT 10 Phương pháp bọt Ví dụ flag a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] Chương Sắp thứ tự t t t t t t 2006 t t f Nguyễn Trung Trực - Khoa CNTT 16 Phương pháp bọt var a: array [1 n] of integer; procedure Bubble; var i, k, x: integer; flag: boolean; begin flag := true; k := 1; while flag begin flag := false; for i := to n-k if a[i] > a[i+1] then begin x := a[i]; a[i] := a[i+1]; a[i+1] := x; flag := true end; k := k + end end; Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT 17 Phương pháp thứ tự nhanh Phương pháp f Bước 1: Cho q = r = n f Bước 2: Xét dãy aq, …, ar Chọn phần tử x tùy ý f Bước 3: Cho i chạy từ đầu dãy j chạy từ cuối dãy Phân chia aq, …, ar cho dãy aq, …, aj ≤ x dãy ai, …, ar ≥ x cách hoán đổi (≥ x) với aj (≤ x) f Bước 4: Nếu q < j cho r = j đến Bước Nếu i < r cho q = i đến Bước Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT 18 Phương pháp thứ tự nhanh var a: array [1 n] of integer; procedure QuickSort; procedure Sort (q, r: integer); var i, j, x, y: integer; begin i := q; j := r; x := a[(q+r) div 2]; repeat while a[i] < x i := i + 1; while x < a[j] j := j - 1; if i j; if q < j then Sort (q,j); if i < r then Sort (i, r) end; begin Sort (1, n) end; Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT 19 Phương pháp thứ tự theo đống Định nghĩa f Dãy ai, ai+1,…, aj đống (heap) nếu: ak.key ≤ a2k.key ak ak.key ≤ a2k+1.key với k = i,…,[j / 2] Các tính chất a2k a2k+1 f Nếu dãy a1, a2,…, an đống dãy chưa có thứ tự f Nếu dãy a1, a2,…, an đống a1 có khóa nhỏ f Nếu dãy a1, a2,…, an có thứ tự dãy đống f Đối với dãy a1, a2,…, an dãy aj, aj+1,…, an với j = [n / 2] + xem đống Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT 20 Phương pháp thứ tự theo đống Ví dụ f Giai đoạn 1: Tạo đống ban đầu từ nửa cuối dãy (q=4) (q=3) (q=2) (q=1) Chương Sắp thứ tự 5 5 7 3 2 2 1 5 9 9 8 8 2006 4 4 3 7 6 6 Nguyễn Trung Trực - Khoa CNTT 21 Phương pháp thứ tự theo đống Ví dụ f Giai đoạn 2: Tạo dãy có thứ tự (giảm dần) 9 (r=9) (r=8) (r=7) (r=6) (r=5) (r=4) (r=3) (r=2) Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT 22 Phương pháp thứ tự theo đống a4 = 1 a3 = Chương Sắp thứ tự a2 = 4 2006 Nguyễn Trung Trực - Khoa CNTT 23 Phương pháp thứ tự theo đống a1 = 5 Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT 24 Phương pháp thứ tự theo đống 9 Chương Sắp thứ tự 8 2006 Nguyễn Trung Trực - Khoa CNTT 25 Phương pháp thứ tự theo đống 9 8 Chương Sắp thứ tự 4 2006 Nguyễn Trung Trực - Khoa CNTT 26 Phương pháp thứ tự theo đống Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT 27 Phương pháp thứ tự theo đống var a: array [1 n] of integer; procedure Heap_Sort; var q, r: integer; x: integer; Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT 28 Phương pháp thứ tự theo đống procedure Sift; var i, j: integer; cont: boolean; begin i := q; j := * i; x := a[i]; cont := true; while (j a[j+1] then j := j + 1; if x begin q := q - 1; Sift end; while r > begin x := a[1]; a[1] := a[r]; a[r] := x; r := r - 1; Sift end end; Chương Sắp thứ tự 2006 Nguyễn Trung Trực - Khoa CNTT 30