Cấu trúc dữ liệu và kỹ thuật sắp xếp
1Môn: CẤU TRÚC DỮ LIỆUChương 3: KỸ THUẬT SẮP XẾP 2NỘI DUNG CHƯƠNG 31. Khái quát về sắp xếp2. 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ỗ (Exchange)Sắp xếp bằng phương pháp chọn (Selection)Sắp xếp bằng phương pháp chèn (Insertion)Sắp xếp bằng phương pháp trộn (Merge)1. 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ộnSắp xếp tập tin theo chỉ mụcBÀI TẬP 31. Khái quát về sắp xếpSắp xếp là thao tác cần thiết thường được thực hiện trong quá trình lưu trữ và quản lý dữ liệu.Thứ tự dữ liệu có thể tăng hay giảm, tăng hay giảm thuật toán sắp xếp là tương tự.Hai nhóm giải thuật sắp xếpCác giải thuật sắp xếp thứ tự nội (sx thứ tự trên mảng)Các giải thuật sắp xếp thứ tự ngoại (sx thứ tự trên tập tin)Xem như mỗi phần tử dữ liệu được xem xét có một thành phần khóa (Key) để nhận diện có kiểu dữ liệu T, các thành phần còn lại là thông tin (Info), như vậy mỗi phần tử có cấu trúc như sau:typedef struct DataElement{T Key;InfoData Info;} DataType;Để đơn giản, quan tâm thành phần dữ liệu chỉ là khóa nhận diện 42. Sắp xếp trên dãy/mảng2.1. Sắp xếp bằng phương pháp đổi chỗ (Exchange)a. Thuật toán sắp xếp nổi bọt (Bubble Sort)b. Thuật toán sắp xếp dựa trên phân hoạch (Partitioning Sort) (thuật toán sx nhanh Quick Sort)2.2. Sắp xếp bằng phương pháp chọn (Selection Sort)Chọn trực tiếp (Straight Selection Sort)2.3. Sắp xếp bằng phương pháp chèn (Insertion Sort)Chèn trực tiếp (Straight Insertion Sort)2.4. Sắp xếp bằng 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 trên dãy/mảng (tt)2.1. a. Thuật toán sắp xếp nổi bọt (Bubble Sort)Ý tưởng:Đi từ cuối mảng đến đầu mảng, nếu phần tử ở dưới < phần tử đứng trên nó thì sẽ được “đưa lên trên”.Sau mỗi lần đi duyệt dãy, 1 phần tử sẽ được đưa lên đúng chỗ của nó. Đối với mảng M có N phần tử thì sau N-1 lần đi duyệt dãy dãy M có thứ tự tăng. 62. Sắp xếp trên dãy/mảng (tt)2.1. a. Bubble Sort (tt) Thuật toán:B1: First = 1B2: IF (First == N) Thực hiện BKTB3: ELSEB31: Under = NB32: IF (Under == First)Thực hiện B4B33: ELSE IF (M[Under]<M[Under – 1])Chuyển vị trí (M[Under], M[Under – 1])Under – Lặp lại B32B4: First++B5: Lặp lại B2BKT: Kết thúc 72. Sắp xếp trên dãy/mảng (tt)2.1. a. Bubble Sort (tt) Cài đặt thuật toán:void Swap(T &X, T &Y){ T Temp = X;X = Y;Y = Temp;return;}void BubbleSort(T M[], int N){ for(int I =0; I<N-1; I++)for(int J =N-1; J>I; J--)if (M[J] < M[J-1])Swap(M[J], M[J-1]);return;} 82. Sắp xếp trên dãy/mảng (tt)2.1. a. Bubble Sort (tt) Phân tích thuật toán:Trong mọi trường hợpSố phép gán G = 0Số phép so sánh S = (N-1) + (N-2) +… + 1 = ½N(N-1)Trong trường hợp tốt nhấtSố phép hoán vị các phần tử Hmin = 0Trong trường hợp xấu nhấtSố phép hoán vị các phần tử Hmax = (N-1) + (N-2) +… + 1 92. Sắp xếp trên dãy/mảng (tt)2.1. a. Bubble Sort (tt) Nhận xét thuật toán:Thuật toán đơn giản dễ cài đặtVói Bubble Sort, phần tử “nhỏ” ở dưới được đưa lên rất nhanh nhưng phần tử “lớn” lại đi xuống chậm, không tận dụng được chiều ngược lạiThuật toán không nhận diện được các phần tử ở 2 đầu của mảng đã nằm đúng vị trí để giảm bớt quãng đường trong mỗi lần duyệt. 102. Sắp xếp trên dãy/mảng (tt)2.1. b. Thuật toán sắp xếp dựa trên phân hoạch (Partitioning Sort) (thuật toán sx nhanh Quick Sort)Ý tưởng:Phân hoạch mảng M thành 3 dãy con:Dãy con thứ 1 gồm các phần tử có giá trị nhỏ hơn giá trị trung bình của dãy MDãy con thứ 2 gồm các phần tử có giá trị bằng giá trị trung bình của dãy MDãy con thứ 3 gồm các phần tử có giá trị lớn hơn giá trị trung bình của dãy MNếu: dãy con thứ 1, 3 có nhiều hơn 1 phần tử thì tiếp tục phân hoạch các dãy này.Tìm giá trị trung bình của dãy là mất thời gian trong thực tế chọn phần tử đứng giữa là dãy con thứ 2.Việc phân hoạch dãy được thực hiện: tìm các cặp phần tử (của dãy 1 và dãy 3) sai thứ tự để hoán vị cho nhau [...]... thúc 3 1. Khái quát về sắp xếp Sắp xếp là thao tác cần thiết thường được thực hiện trong quá trình lưu trữ và quản lý dữ liệu. Thứ tự dữ liệu có thể tăng hay giảm, tăng hay giảm thuật tốn sắp xếp là tương tự. Hai nhóm giải thuật sắp xếp Các giải thuật sắp xếp thứ tự nội (sx thứ tự trên mảng) Các giải thuật sắp xếp thứ tự ngoại (sx thứ tự trên tập tin) Xem như mỗi phần tử dữ liệu được xem xét có... N B8: Hoán vị (M[K+1], M[PositionMin]) B9: K++ B10: Lặp lại B2 BKT: Kết thúc 27 3. Sắp xếp trên tập tin 1. Sắp xếp trong file bằng phương pháp trộn a. Trộn trực tiếp (Straight Merge Sort) b. Trộn tự nhiên (Natural Merge Sort) 2. Sắp xếp theo chỉ mục 11 2. Sắp xếp trên dãy/mảng (tt) 2.1. b. Quick Sort (tt) Thuật toán B1: First = 1 B2: Last = N B3: IF (First >= Last) // mảng con chỉ cịn khơng... dãy 1 và dãy 3) sai thứ tự để hoán vị cho nhau 7 2. Sắp xếp trên dãy/mảng (tt) 2.1. a. Bubble Sort (tt) Cài đặt thuật toán: void Swap(T &X, T &Y) { T Temp = X; X = Y; Y = Temp; return; } void BubbleSort(T M[], int N) { for(int I =0; I<N-1; I++) for(int J =N-1; J>I; J ) if (M[J] < M[J-1]) Swap(M[J], M[J-1]); return; } 5 2. Sắp xếp trên dãy/mảng (tt) 2.1. a. Thuật toán sắp xếp nổi... dài mỗi run L= K. Sau mỗi lần phân phối và trộn các run trên Fd số các run giảm K lần, và tương ứng chiều dài mỗi run trên Fd sẽ tăng K lần. Sau Log 2 N lần phân phối và trộn Fd chỉ còn lại 1 rund với chiều dài N dữ liệu tập tin Fd có thứ tự Thuật giải chia làm 2 phần Thuật giải phân phối các đường chạy L trên Fd về 2 dãy phụ Ft1 & Ft2 Thuật giải trộn các cặp đường chạy trên Ft1... B8 B9: ELSE B91: M[Position] = X B92: K++ B93: Lặp lại B2 BKT: Kết thúc 13 2. Sắp xếp trên dãy/mảng (tt) 2.1. b. Quick Sort (tt) Cài đặt thuật toán void Swap(T &X, T &Y) { T Temp = X; X = Y; Y = Temp; return } void QuickSort(T M[], int N) { PartitionSort(M, 0, N-1); return; } 14 2. Sắp xếp trên dãy/mảng (tt) 2.2. Sắp xếp bằng phương pháp chọn (Selection Sort) Chọn trực tiếp (Straight Selection... QuickSort hay Bubble Sort? (VD: dãy : 23 4 6 77 45 5 6 7) Cài đặt các giải thuật sắp xếp trong lý thuyết đối với các dãy | mảng có giá trị giảm dần 10 2. Sắp xếp trên dãy/mảng (tt) 2.1. b. Thuật toán sắp xếp dựa trên phân hoạch (Partitioning Sort) (thuật toán sx nhanh Quick Sort) Ý tưởng: Phân hoạch mảng M thành 3 dãy con: Dãy con thứ 1 gồm các phần tử có giá trị nhỏ hơn giá trị trung bình của dãy... trên tập tin) Xem như mỗi phần tử dữ liệu được xem xét có một thành phần khóa (Key) để nhận diện có kiểu dữ liệu T, các thành phần cịn lại là thơng tin (Info), như vậy mỗi phần tử có cấu trúc như sau: typedef struct DataElement { T Key; InfoData Info; } DataType; Để đơn giản, quan tâm thành phần dữ liệu chỉ là khóa nhận diện 31 BÀI TẬP Bài tập chương 3 (trang 84 - 85) (Lý thuyết) Cho một mảng số... 24 2. Sắp xếp trên dãy/mảng (tt) 2.4. a. (tt) Phân tích thuật tốn Straight Merge Sort Thực hiện log 2 N lần phân phối và trộn các run Mỗi lần phân phối thực hiện N phép gán, 2N phép so sánh Mỗi lần trộn N phép gán, 2N+N/2 phép so sánh Số phép hoán vị cho mọi trường hợp: H = 0 Thuật giải dùng 2 dãy phụ, tổng số phần tử trong 2 dãy phụ = N lãng phí bộ nhớ cải tiến dùng 1 dãy phụ và kết... 12 2. Sắp xếp trên dãy/mảng (tt) 2.1. b. Quick Sort (tt) Cài đặt thuật toán void PartitionSort(T M[], int First, int Last) { if (First >=Last) return; T X = M[(First + Last)/2]; int I = First; int J = Last; do { while (M[I] < X) I++; while (M[J] > X) J if (I<=J) { Swap(M[I], M[J]); I++; J ; } } while (I <=J); PartitionSort(M, First, J); PartitionSort(M, I, Last); Return; } 17 2. Sắp xếp. .. lần chọn thứ nhất, còn lại N-1 phần tử chưa có thứ tự. Tiếp tục thực hiện, sau N-1 lần lựa chọn và đưa phần tử nhỏ nhất lên trên dãy M có thứ tự tăng dần. Để tìm phần tử nhỏ nhất của dãy dựa vào cách tìm kiếm duyệt dãy tuần tự. 8 2. Sắp xếp trên dãy/mảng (tt) 2.1. a. Bubble Sort (tt) Phân tích thuật tốn: Trong mọi trường hợp Số phép gán G = 0 Số phép so sánh S = (N-1) + (N-2) +… + 1 . 1Môn: CẤU TRÚC DỮ LIỆUChương 3: KỸ THUẬT SẮP XẾP 2NỘI DUNG CHƯƠNG 31. Khái quát về sắp xếp2 . Các phương pháp sắp xếp (Sắp xếp trên dãy) Sắp xếp bằng. trữ và quản lý dữ liệu. Thứ tự dữ liệu có thể tăng hay giảm, tăng hay giảm thuật toán sắp xếp là tương tự.Hai nhóm giải thuật sắp xếp Các giải thuật sắp xếp