Bài giảng Cấu trúc dữ liệu - Chương 3: Các thuật toán sắp xếp cung cấp cho người học các kiến thức: Chọn trực tiếp - Selection Sort, chèn trực tiếp - Insertion Sort, đổi chỗ trực tiếp - Interchange Sort, nổi bọt - Bubble Sort, sắp xếp dựa trên phân hoạch - Quick Sort, trộn trực tiếp - Merge Sort. Mời các bạn cùng tham khảo.
CHƯƠNG CÁC THUẬT TOÁN SẮP XẾP GV Th.S Thiều Quang Trung Trường Cao đẳng Kinh tế Đối ngoại Nội dung • Chọn trực tiếp - Selection Sort • Chèn trực tiếp - Insertion Sort • Đổi chỗ trực tiếp - Interchange Sort • Nổi bọt - Bubble Sort • Sắp xếp dựa phân hoạch - Quick Sort • Trộn trực tiếp - Merge Sort GV Thiều Quang Trung Các khái niệm • Sắp xếp ? – Sắp xếp trình xử lý danh sách phần tử (hoặc mẫu tin) để đặt chúng theo thứ tự thỏa mãn tiêu chuẩn • Khái niệm nghịch thế: – Xét mảng số a0, a1, … ,aN – Giả sử xét mảng có thứ tự tăng dần, có i < j > aj, ta gọi nghịch GV Thiều Quang Trung Các khái niệm • Để xếp mảng => tìm cách giảm số nghịch mảng cách hoán vị cặp phần tử • Cho trước dãy số a1, a2, … aN lưu trữ cấu trúc liệu mảng Ví dụ: int a[N]; => Chọn lựa số phương pháp để xếp GV Thiều Quang Trung Chọn trực tiếp - Selection Sort • Ý tưởng: thực N-1 lần việc đưa phần tử nhỏ dãy hành vị trí đứng đầu dãy • Nhận xét: mảng có thứ tự phần tử (ai,ai+1, ,an-1) => Ý tưởng thuật toán chọn trực tiếp: – Chọn phần tử nhỏ N phần tử ban đầu, đưa phần tử vị trí đứng đầu dãy hành; – Sau khơng quan tâm phần tử nữa, xem dãy hành N-1 phần tử dãy ban đầu, vị trí thứ 2; – Lặp lại trình cho dãy hành … dãy hành phần tử GV Thiều Quang Trung Chọn trực tiếp (tt) • Giải thuật : B1: i = 0; B2: Tìm phần tử a[min] nhỏ dãy hành từ a[i] đến a[n] B3: if (min ≠ i) : hoán vị a[min] a[i] B4: if (i≤ (n-1): B4.1: i++ B4.2: Lặp lại B2 Ngược lại : dừng // n-1 phần tử nằm vị trí GV Thiều Quang Trung Chọn trực tiếp (tt) GV Thiều Quang Trung 77 Chọn trực tiếp (tt) GV Thiều Quang Trung 88 Cài đặt giải thuật Chọn trực tiếp void SelectionSort(int a[],int n ) { int min; // số phần tử nhỏ dãy hành for (int i=0; i Phân hoạch dãy ban đầu thành dãy ▪ Sau phân hoạch xong, dãy ban đầu tách thành dãy phụ theo nguyên tắc phân phối luân phiên ▪ Trộn cặp dãy dãy phụ thành dãy dãy ban đầu, ta nhận lại dãy ban đầu với số lượng dãy giảm nửa ▪ Lặp lại trình sau số bước, ta nhận dãy gồm dãy không giảm Nghĩa dãy ban đầu xếp GV Thiều Quang Trung 49 49 Giải thuật Trộn trực tiếp - Merge Sort (tt) ▪ Giải thuật trộn phương pháp đơn giản Việc phân hoạch thành dãy đơn giản tách dãy gồm n phần tử thành n dãy Cứ lần tách trộn, chiều dài dãy nhân đôi GV Thiều Quang Trung 50 50 Giải thuật Trộn trực tiếp - Merge Sort (tt) Giải thuật : B1 : k = 1; // k chiều dài dãy bước hành B2 : Tách dãy a1, a2, … , an thành dãy b, c theo nguyên tắc luân phiên nhóm k phần tử : b = a1, … , ak, a2k +1, … a3k, … c = ak + 1, … , a2k, a3k +1, … a4k, … B3 : Trộn cặp dãy gồm k phần tử dãy b, c vào a B4 : k = k * 2; Nếu k < n trở lại bước Ngược lại : Dừng GV Thiều Quang Trung 51 51 Ví dụ mơ giải thuật Merge Sort • Cho dãy số a : N = ; 12 GV Thiều Quang Trung 15 52 52 Ví dụ mơ giải thuật Merge Sort (tt) GV Thiều Quang Trung 53 53 Cài đặt giải thuật Merge Sort void MergeSort (int a[], int N) int pa, pb, pc;// số mảng a,b,c int i, k = 1; // độ dài dãy phân hoạch int b [N], c[N]; // hai mảng phụ // tách a thành b c pa = pb = pc = 0; while (pa < N) for (i = ; (pa < N) && (i < k) ; i++) b [pb++] = a [pa++]; for (i = ; (pa < N) && (i < k) ; i ++) c [pc++] = a [pa++] Merge (a, b, c, pb, pc, k); // trộn b, c lại thành a k * = 2; while (k < N); GV Thiều Quang Trung 54 54 Cài đặt giải thuật Merge Sort (tt) void Merge ( int a [], int b [], int c [], int nb, int nc, int k) int pa, pb, pc, ib, ic, kb, kc; pa = pb = pc = ; ib = ic = ; while ((nb > 0) && (nc > 0)) kb = (k, nb) ; kc = (k, nc) ; if (b [pb + ib]