Bài giảng Cấu trúc dữ liệu và giải thuật: Các thuật toán sắp xếp (P1) có cấu trúc gồm 3 phần cung cấp cho người học các kiến thức: Sắp xếp chọn (selection sort), sắp xếp nổi bọt (bubble sort), sắp xếp chèn (insertion sort). Mời các bạn cùng tham khảo.
Các thuật toán xếp (p1) (sorting algorithms) Nguyễn Mạnh Hiển Khoa Cơng nghệ thơng tin hiennm@tlu.edu.vn Các thuật tốn xếp - phần • Sắp xếp chọn (selection sort) • Sắp xếp bọt (bubble sort) • Sắp xếp chèn (insertion sort) Sắp xếp chọn (selection sort) • Cho 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 1: USL = {a0, a1, …, aN-1} − Bước 2: USL = {a1, …, aN-1} −… − Bước N-1: USL = {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 USL sang phải phần tử Sắp xếp chọn: Ví dụ • • • • • Ban đầu: Sau bước 1: Sau bước 2: Sau bước 3: Sau bước 4: 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 (danh sách chưa xếp gạch chân) Cài đặt phân tích xếp chọn • Viết hàm selectionSort() • Chứng minh thời gian chạy O(N2) Sắp xếp bọt (bubble sort) • Mỗi bước: − So sánh hai phần tử kề − Đổ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 • Thời gian chạy: O(N2) Sắp xếp bọt: Ví dụ • • • • Ban đầu: Sau bước 1: Sau bước 2: Sau bước 3: 2, 3, 1, 15 2, 1, 3, 15 1, 2, 3, 15 1, 2, 3, 15 (danh sách chưa xếp gạch chân) Sắp xếp bọt: Cài đặt for (i = 0; i < N-1; i++) { for (j = 0; j < N-1-i; j++) if (a[j+1] < a[j]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } • Trong trường hợp tốt (dãy xếp rồi), xếp bọt nên thời gian O(N) tối ưu hóa cài đặt bên trên! Sắp xếp chèn (insertion sort) • Có N-1 bước ứng với p = 1, 2, …, N-1 • Ở bước p: (khi bắt đầu bước p, vị trí 0, …, p-1 xếp rồi) − Xác định vị trí phù hợp vị trí 0, …, p-1 cho phần tử vị trí p (ap) − Chèn ap vào vị trí xác định, vị trí từ đến p xếp Sắp xếp chèn: Ví dụ Sắp xếp chèn: Cài đặt Phân tích xếp chèn • Trường hợp tốt nhất: O(N) • Trường hợp tồi nhất: O(N2) .. .Các thuật tốn xếp - phần • Sắp xếp chọn (selection sort) • Sắp xếp bọt (bubble sort) • Sắp xếp chèn (insertion sort) Sắp xếp chọn (selection sort) • Cho dãy A gồm N phần tử a0, a1, …, aN-1... bước xét danh sách chưa xếp (unsorted sublist - USL) • Có N-1 bước: − Bước 1: USL = {a0, a1, …, aN-1} − Bước 2: USL = {a1, …, aN-1} −… − Bước N-1: USL = {aN-2, aN-1} Sắp xếp chọn (tiếp) • Mỗi bước:... O(N2) Sắp xếp bọt: Ví dụ • • • • Ban đầu: Sau bước 1: Sau bước 2: Sau bước 3: 2, 3, 1, 15 2, 1, 3, 15 1, 2, 3, 15 1, 2, 3, 15 (danh sách chưa xếp gạch chân) Sắp xếp bọt: Cài đặt for (i = 0; i < N-1;