Bài giảng môn Cấu trúc dữ liệu - Chương 3: Kỹ thuật sắp xếp trình bày các nội dung: Khái quát về sắp xếp, các phương pháp sắp xếp - Sắp xếp trên dãy (sắp xếp bằng phương pháp đổi chỗ, sắp xếp bằng phương pháp chọn, sắp xếp bằng phương pháp chèn, sắp xếp bằng phương pháp trộn), các phương pháp sắp xếp - Sắp xếp trên tập tin (sắp xếp tập tin bằng phương pháp trộn, sắp xếp tập tin theo chỉ mục). Mời các bạn cùng tham khảo.
Chương 3: KỸ THUẬT SẮP XẾP 48 49 NỘI DUNG CHƯƠNG Khái quát xếp Các phương pháp xếp (Sắp xếp dãy) • • • • Sắp xếp phương pháp đổi chỗ (Exchange) Sắp xếp phương pháp chọn (Selection) Sắp xếp phương pháp chèn (Insertion) Sắp xếp phương pháp trộn (Merge) Các phương pháp xếp (Sắp xếp tập tin) • • Sắp xếp tập tin phương pháp trộn Sắp xếp tập tin theo mục 50 Khái quát xếp Sắp xếp thao tác cần thiết thường thực trình lưu trữ quản lý liệu Thứ tự liệu tăng hay giảm, tăng hay giảm thuật tốn xếp tương tự Hai nhóm giải thuật xếp Các giải thuật xếp thứ tự nội (sx thứ tự mảng) • • Các giải thuật xếp thứ tự ngoại (sx thứ tự tập tin) Xem phần tử liệu xem xét có thành phần khóa (Key) để nhận diện có kiểu liệu T, thành phần cịn lại thơng tin (Info), phần tử có cấu trúc sau: typedef struct DataElement { T Key; InfoData Info; } DataType; Để đơn giản, quan tâm thành phần liệu khóa nhận diện 51 Sắp xếp dãy/mảng 2.1 Sắp xếp phương pháp đổi chỗ (Exchange) a Thuật toán xếp bọt (Bubble Sort) b Thuật toán xếp dựa phân hoạch (Partitioning Sort) (thuật toán sx nhanh Quick Sort) 2.2 Sắp xếp phương pháp chọn (Selection Sort) Chọn trực tiếp (Straight Selection Sort) 2.3 Sắp xếp phương pháp chèn (Insertion Sort) Chèn trực tiếp (Straight Insertion Sort) 2.4 Sắp xếp phương pháp trộn (Merge Sort) a Trộn trực tiếp (Straight Merge Sort) b Trộn tự nhiên (Natural Merge Sort) 52 Sắp xếp dãy/mảng 2.1 a Thuật toán xếp bọt (Bubble Sort) Ý tưởng: Đi từ cuối mảng đến đầu mảng, phần tử < • phần tử đứng “đưa lên trên” Sau lần duyệt dãy, phần tử đưa lên • chỗ Đối với mảng M có N phần tử sau N-1 lần duyệt dãy dãy M có thứ tự tăng 53 Sắp xếp dãy/mảng 2.1 a Bubble Sort (tt) Thuật toán: B1: First = B2: IF (First == N) Thực BKT B3: ELSE B31: Under = N B32: IF (Under == First) Thực B4 B33: ELSE IF (M[Under] N) Thực B8 B7: ELSE IF (Min >M[Postion]) Min = M[Position] PositionMin = Pos Position ++ Lặp lại B6 kiểm tra vị trí so với N B8: Hốn vị (M[K+1], M[PositionMin]) B9: K++ B10: Lặp lại B2 BKT: Kết thúc 63 Sắp xếp dãy/mảng 2.2 (tt) Straight Selection Sort: Cài đặt thuật toán void StraightSelectionSort(T M[], int N) { int K = 0; int PositionMin; while (K K) Thực B7 B6: ELSE B61: IF (X Position) B81: M[I] = M[I-1] B82: I -B83: Lặp lại B8 B9: ELSE B91: M[Position] = X B92: K++ B93: Lặp lại B2 BKT: Kết thúc 67 Sắp xếp dãy/mảng 2.3 (tt) Cài đặt Thuật Toán Chèn trực tiếp (Straight Insertion Sort) void StraightInsertionSort(T M[], int N) { int K = 1; int Position; while (KM[Position]) Position ++; for (int I = K; I > Position; I ) M[I] = [I-1]; M[Position] = X; K++ } return; } 68 Sắp xếp dãy/mảng 2.3 Chèn trực tiếp (Straight Insertion Sort) (tt) Phân tích thuật tốn • Trong trường hợp tốt • • • Số phép gán Gmin = × (N-1) Số phép so sánh Smin = + + … +(N-1) = N ×(N-1)/2 Số phép hoán vị Hmin = Trong trường hợp xấu • • • • Số phép gán Gmax = [2 × (N-1)] + [1+2+…+(N-1)] Số phép so sánh Smax = (N-1) Số phép hoán vị Hmax = Trong trường hợp trung bình • • Số phép gán Gavg = (Gmin+Gmax)/2 Q trình tìm vị trí chèn phần tử thứ K+1 trình dời 69 Sắp xếp dãy/mảng 2.4 Phương pháp xếp Trộn (Merge Sort) • Các thuật tốn trộn tìm cách tách mảng theo đường chạy (run) tiến hành nhập mảng theo cặp để tạo thành đường có chiều dài lớn đường chạy cũ Sau số lần tách nhập, cuối mảng M đường chạy đuợc xếp thứ tự • Đường chạy (run): Dãy M[I], M[I+1],…M[J] (I>=1, I