Bài giảng môn Cấu trúc dữ liệu - Chương 3: Kỹ thuật sắp xếp
Số trang: 29
Loại file: pdf
Dung lượng: 184.19 KB
Lượt xem: 15
Lượt tải: 0
Xem trước 3 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
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.
Nội dung trích xuất từ tài liệu:
Bài giảng môn Cấu trúc dữ liệu - Chương 3: Kỹ thuật sắp xếp Chương 3: KỸ THUẬT SẮP XẾP 48 49 NỘI DUNG CHƯƠNG 3 1. Khái quát về sắp xếp 2. 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) 3. 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 50 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 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 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 51 2. Sắp xếp trên dãy/mảng 2.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 2. Sắp xếp trên dãy/mảng 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. 53 2. Sắp xếp trên dãy/mảng 2.1. a. Bubble Sort (tt) Thuật toán: B1: First = 1 B2: IF (First == N) Thực hiện BKT B3: ELSE B31: Under = N B32: IF (Under == First) Thực hiện B4 B33: ELSE IF (M[Under] 54 2. Sắp xếp trên dãy/mảng 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; II; J--) if (M[J] < M[J-1]) Swap(M[J], M[J-1]); return; } 55 2. Sắp xếp trên dãy/mảng 2.1. a. Bubble Sort (tt) Phân tích thuật toá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 = ½N(N-1) • Trong trường hợp tốt nhất • Số phép hoán vị các phần tử Hmin = 0 • Trong trường hợp xấu nhất • Số phép hoán vị các phần tử Hmax = (N-1) + (N-2) +… + 1 56 2. Sắp xếp trên dãy/mảng 2.1. a. Bubble Sort (tt) Nhận xét thuật toán: • Thuật toán đơn giản dễ cài đặt • Vó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ại • Thuậ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. 57 2. Sắp xếp trên dãy/mảng 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 M • Dã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 M • Dã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 M Nế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 58 2. Sắp xếp trên dãy/mảng 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 quá 1 phần tử Thực hiện BKT B4: X = M[(First + Last)/2] B5: I = First // Từ dãy con số 1 tìm phần tử có giá trị lớn hơn X B6: IF (M[I] > X) Thực hiện B8 B7: ELSE I++ Lặp lại B6 B8: J = Last // Xuất phát từ cuối dãy 3 để tìm phần tử có giá trị nhỏ hơn X B9: IF (M[J] < X) Thực hiện B11 B10: ELSE J-- Lặp lại B9 B11: IF (I 59 2. Sắp xếp trên dãy/mảng 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 60 2. Sắp xếp trên dãy/mảng ...
Nội dung trích xuất từ tài liệu:
Bài giảng môn Cấu trúc dữ liệu - Chương 3: Kỹ thuật sắp xếp Chương 3: KỸ THUẬT SẮP XẾP 48 49 NỘI DUNG CHƯƠNG 3 1. Khái quát về sắp xếp 2. 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) 3. 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 50 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 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 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 51 2. Sắp xếp trên dãy/mảng 2.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 2. Sắp xếp trên dãy/mảng 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. 53 2. Sắp xếp trên dãy/mảng 2.1. a. Bubble Sort (tt) Thuật toán: B1: First = 1 B2: IF (First == N) Thực hiện BKT B3: ELSE B31: Under = N B32: IF (Under == First) Thực hiện B4 B33: ELSE IF (M[Under] 54 2. Sắp xếp trên dãy/mảng 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; II; J--) if (M[J] < M[J-1]) Swap(M[J], M[J-1]); return; } 55 2. Sắp xếp trên dãy/mảng 2.1. a. Bubble Sort (tt) Phân tích thuật toá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 = ½N(N-1) • Trong trường hợp tốt nhất • Số phép hoán vị các phần tử Hmin = 0 • Trong trường hợp xấu nhất • Số phép hoán vị các phần tử Hmax = (N-1) + (N-2) +… + 1 56 2. Sắp xếp trên dãy/mảng 2.1. a. Bubble Sort (tt) Nhận xét thuật toán: • Thuật toán đơn giản dễ cài đặt • Vó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ại • Thuậ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. 57 2. Sắp xếp trên dãy/mảng 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 M • Dã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 M • Dã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 M Nế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 58 2. Sắp xếp trên dãy/mảng 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 quá 1 phần tử Thực hiện BKT B4: X = M[(First + Last)/2] B5: I = First // Từ dãy con số 1 tìm phần tử có giá trị lớn hơn X B6: IF (M[I] > X) Thực hiện B8 B7: ELSE I++ Lặp lại B6 B8: J = Last // Xuất phát từ cuối dãy 3 để tìm phần tử có giá trị nhỏ hơn X B9: IF (M[J] < X) Thực hiện B11 B10: ELSE J-- Lặp lại B9 B11: IF (I 59 2. Sắp xếp trên dãy/mảng 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 60 2. Sắp xếp trên dãy/mảng ...
Tìm kiếm theo từ khóa liên quan:
Cấu trúc dữ liệu Sắp xếp trên dãy Sắp xếp trên tập tin Kỹ thuật sắp xếp Sắp xếp bằng phương pháp chọn Sắp xếp bằng phương pháp trộnGợi ý tài liệu liên quan:
-
Đề cương chi tiết học phần Cấu trúc dữ liệu và giải thuật (Data structures and algorithms)
10 trang 304 0 0 -
Bài giảng Phân tích thiết kế phần mềm: Chương 1 - Trường ĐH Ngoại ngữ - Tin học TP.HCM
64 trang 148 0 0 -
Giải thuật và cấu trúc dữ liệu
305 trang 142 0 0 -
Tập bài giảng Thực hành kỹ thuật lập trình
303 trang 139 0 0 -
Giáo trình Cấu trúc dữ liệu và thuật toán (Tái bản): Phần 1
152 trang 137 0 0 -
Tài liệu tham khảo: Cấu trúc dữ liệu và giải thuật
229 trang 103 0 0 -
Lập trình C - Cấu trúc dữ Liệu
307 trang 71 0 0 -
49 trang 67 0 0
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 2 - Ngô Công Thắng
8 trang 64 0 0 -
Ứng dụng và cài đặt cấu trúc dữ liệu bằng C: Phần 1
338 trang 60 0 0