1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng cấu trúc dữ liệu và giải thuật sắp xếp nguyễn mạnh hiển

39 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

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

Ngày đăng: 26/12/2021, 17:20

TỪ KHÓA LIÊN QUAN