Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 39 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
39
Dung lượng
423,3 KB
Nội dung
Sắp xếp (Sorting) Nguyễn Mạnh Hiển hiennm@tlu.edu.vn Nội dung Sắp xếp chọn Sắp xếp bọt Sắp xếp chèn Sắp xếp vun đống Sắp xếp trộn Sắp xếp nhanh Sắp xếp chọn (selection sort) Sắp xếp chọn • Dãy A gồm n phần tử a0, a1, …, an-1 • Mỗi bước xét danh sách chưa xếp (unsorted sublist - USL) • Có n-1 bước: − Bước 0: USL0 = {a0, a1, …, an-1} − Bước 1: USL1 = {a1, …, an-1} … − Bước n-2: USLn-1 = {an-2, an-1} Sắp xếp chọn (tiếp) • Mỗi bước: − Tìm phần tử nhỏ amin USL − Đổi chỗ amin phần tử USL − Dịch chuyển biên trái USL sang phải vị trí Ví dụ xếp chọn • • • • • Ban đầu: Sau bước 0: Sau bước 1: Sau bước 2: Sau bước 3: 64, 25, 12, 22, 11 11, 25, 12, 22, 64 11, 12, 25, 22, 64 11, 12, 22, 25, 64 11, 12, 22, 25, 64 (11 64) (12 25) (22 25) (25 25) (Danh sách chưa xếp gạch chân) Cài đặt xếp chọn template void selectionSort(vector & a) { for (int i = 0; i < a.size() - 1; i++) { int vt = i; // Vị trí for (int j = i + 1; j < a.size(); j++) if (a[vt] > a[j]) vt = j; // Cập nhật vị trí if (vt != i) { // Đổi chỗ phần tử đầu USL T tg = a[vt]; a[vt] = a[i]; a[i] = tg; } } } Phân tích xếp chọn • Đếm số phép so sánh a[vt] > a[j] • Vòng for bên lặp với j từ i+1 đến n-1, tức có n-1-i phép so sánh • Vịng for bên lặp với i từ đến n-2 𝑛−2 𝑡 𝑛 = 𝑛 − − 𝑖 = 𝑛 − + 𝑛 − + ⋯+ 𝑖=0 𝑛 𝑛−1 = 𝑂(𝑛2 ) = 2 Sắp xếp bọt (bubble sort) Sắp xếp bọt • Mỗi bước duyệt qua phần tử a0, a1, …, ak • Tại phần tử (i < k): − So sánh với ai+1 − Đổi chỗ chúng chưa thứ tự • Sau bước, phần tử lớn đặt (“nổi bọt”) xuống cuối dãy (ak max) Sắp xếp trộn (merge sort) Sắp xếp trộn • Xét dãy gồm n phần tử • Nếu n = 1: Dãy xếp • Nếu n > 1: − Chia dãy thành hai nửa trái phải, nửa có kích thước n/2 − Sắp xếp trộn nửa (gọi đệ quy) − Trộn hai nửa thành danh sách đầy đủ cho danh sách xếp Thao tác trộn (1) Đầu vào: Hai dãy A B xếp Đầu ra: Dãy C xếp, gồm tất phần tử A B • Dùng đếm Actr, Bctr, Cctr để vị trí hành dãy A, B, C • Mỗi bước: − So sánh hai phần tử hành A B − Sao chép phần tử nhỏ sang vị trí hành C − Tăng đếm tương ứng (Sẽ chép 1, tăng Actr Cctr) Thao tác trộn (2) Thao tác trộn (3) A hết, chép phần cịn lại B sang C: Phân tích thao tác trộn: • Có n bước (n tổng số phần tử A B) • Mỗi bước thời gian để chép phần tử từ A B sang C Thời gian chạy thao tác trộn O(n) Cài đặt xếp trộn template void mergeSort(vector & a) { vector tmpArray(a.size()); mergeSort(a, tmpArray, 0, a.size() - 1); } // tmpArray mảng tạm để chứa kết trộn // left vị trí trái mảng cần xếp // right vị trí phải mảng cần xếp template void mergeSort(vector & a, vector & tmpArray, int left, int right) { if (left < right) { int center = (left + right) / 2; mergeSort(a, tmpArray, left, center); mergeSort(a, tmpArray, center + 1, right); merge(a, tmpArray, left, center + 1, right); } } Cài đặt thao tác trộn // leftPos vị trí bắt đầu nửa trái // rightPos vị trí bắt đầu nửa phải // rightEnd vị trí cuối nửa phải template void merge(vector & a, vector & tmpArray, int leftPos, int rightPos, int rightEnd) { int leftEnd = rightPos - 1; // Vị trí cuối nửa trái int tmpPos = leftPos; // Vị trí hành mảng tạm int numElements = rightEnd - leftPos + 1; // Số phần tử nửa while (leftPos