1. Trang chủ
  2. » Tất cả

Bài giảng cấu trúc dữ liệu và thuật toán chương 5 nguyễn khánh phương

20 2 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

co ng c om TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG Nguyễn Khánh Phương u du o ng th an Cấu trúc liệu giải thuật cu Computer Science department School of Information and Communication technology E-mail: phuongnk@soict.hust.edu.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt Nội dung khóa học cu u du o ng th an co ng c om Chương Các khái niệm Chương Các sơ đồ thuật toán Chương Các cấu trúc liệu Chương Cây Chương Sắp xếp Chương Tìm kiếm Chương Đồ thị CuuDuongThanCong.com https://fb.com/tailieudientucntt co ng c om TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG Nguyễn Khánh Phương u du o ng th an Chương Sắp xếp cu Computer Science department School of Information and Communication technology E-mail: phuongnk@soict.hust.edu.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt Bài toán xếp cu u du o ng th an co ng c om • Sắp xếp (Sorting) trình tổ chức lại họ liệu theo thứ tự giảm dần tăng dần • Dữ liệu cần xếp là: – Số nguyên/thực (integers/float) – Xâu kí tự (character strings) – … • Khóa xếp (sort key) – Là phận ghi xác định thứ tự xếp ghi họ ghi – Ta cần xếp ghi theo thứ tự khoá – Ví dụ: khóa tong = toan + ly + hoa typedef struct{ char *ma; struct{ float toan, ly, hoa, tong; } DT; }thisinh; typedef struct node{ thisinh data; struct node* next; }node; CuuDuongThanCong.com https://fb.com/tailieudientucntt Các loại thuật tốn xếp Sắp xếp (internal sort): Địi hỏi họ liệu đưa toàn vào nhớ máy tính • Ví dụ: c om • ng – insertion sort (sắp xếp chèn), selection sort (sắp xếp lựa chọn), bubble sort (sắp xếp bọt) an co – quick sort (sắp xếp nhanh), merge sort (sắp xếp trộn), heap sort (sắp xếp vun đống), sample sort (sắp xếp dựa mẫu), shell sort (vỏ sò) th Sắp xếp ngồi (external sort): Họ liệu khơng thể lúc đưa tồn vào nhớ trong, đọc vào phận từ nhớ • Ví dụ:Poly-phase mergesort (trộn nhiều đoạn), cascade-merge (thác nước), oscillating sort (dao động) cu u du o ng • Sắp xếp song song (Parallel sort): • Bitonic sort, Batcher even-odd sort • Smooth sort, cube sort, column sort • GPU sort NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt Các đặc trưng thuật tốn xếp c om • Tại chỗ (in place): khơng gian nhớ phụ mà thuật tốn địi hỏi O(1), nghĩa bị chặn số không phụ thuộc vào độ dài dãy cần xếp 20 th 10 20 30 10 cu u du o ng Trước xếp an co ng • Ổn định (stable): Nếu phần tử có giá trị giữ nguyên thứ tự tương đối chúng trước xếp Sau xếp 10 Sắp xếp ổn định thứ tự bóng có giá trị không thay đổi trước sau xếp: • Quả bóng màu xanh với giá trị 10 đứng trước bóng màu cam giá trị 10 • Tương tự với bóng xanh cam giá trị 20 10 20 20 30 NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt Bài tốn xếp c om • Có hai phép toán mà thuật toán xếp thường phải sử dụng: – Đổi chỗ (Swap): Thời gian thực O(1) th an co ng void swap( datatype *a, datatype *b){ datatype *temp = *a; //datatype-kiểu liệu phần tử *a = *b; *b = *temp; } cu u du o ng – So sánh: Compare(a, b) trả lại true a trước b thứ tự cần xếp false trái lại • Phân tích thuật tốn xếp: thơng thường, thuật toán sử dụng phép toán so sánh để xác định thứ tự hai phần tử thực đổi chỗ cần  Khi phân tích thuật toán xếp, ta cần đếm số phép toán so sánh số lần dịch chuyển phần tử (bỏ qua phép tốn khác khơng ảnh hưởng đến kết quả) NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt Bài toán xếp cu u du o ng th an co ng c om • Các thuật toán sử dụng phép toán so sánh để xác định thứ tự hai phần tử gọi thuật toán sử dụng phép so sánh (Comparison-based sorting algorithm) • Nếu có thơng tin bổ sung liệu đầu vào, ví dụ như: – Các số nguyên nằm khoảng [0 k] k = O(n) – Các số thực phân bố khoảng [0, 1) ta có thuật tốn tốt thuật toán xếp dựa vào phép so sánh (Thuật tốn thời gian tuyến tính: xếp đếm (couting-sort), xếp theo số (radixsort), xếp đóng gói (bucket-sort)) NGUYỄN KHÁNH PHƯƠNG Bộ mơn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt Các thuật toán xếp cu u du o ng th an co ng c om Khi so sánh thuật tốn, thơng thường quan tâm đến: • Thời gian chạy Đối với liệu lớn, thuật tốn khơng hiệu chạy chậm ứng dụng thực tế • Bộ nhớ Các thuật tốn nhanh địi hỏi đệ quy phải tạo copy liệu xử lí Với hệ thống mà nhớ có giới hạn (ví dụ embedded system), vài thuật tốn khơng thể chạy • Độ ổn định (stability) Độ ổn định định nghĩa dựa điều xảy với phần tử có giá trị giống – Đối với thuật toán xếp ổn định, phần tử với giá trị giữ nguyên thứ tự mảng trước sau xếp – Đối với thuật tốn xếp khơng ổn định, phần tử có giá trị có thứ tự NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt ng ng th an Nhiều khóa ? Các khóa phân biệt ? Nhiều dạng khóa ? Kích thước ghi lớn hay nhỏ ? Dữ liệu xếp ngẫu nhiên? du o – – – – – co Nhiều yếu tố ảnh hưởng: • Ổn định • Danh sách liên kết hay mảng • Đặc trưng liệu cần xếp: c om Tiêu chí lựa chọn giải thuật cu u Khơng thể bao phủ tất yếu tố NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt Nội dung cu u du o ng th an co ng c om Sắp xếp chèn (Insertion sort) Sắp xếp chọn (Selection sort) Sắp xếp bọt (Bubble sort) Sắp xếp trộn (Merge sort) Sắp xếp nhanh (Quick sort) Sắp xếp vun đống (Heap sort) 11 CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Sắp xếp chèn (Insertion sort) Để chèn 12, ta cần tạo chỗ cho việc dịch chuyển 36 sau 24 cu u du o ng th an co ng Phỏng theo cách làm người chơi cần "chèn" thêm vào xếp tay NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt 12 .c om Sắp xếp chèn (Insertion sort) Để chèn 12, ta cần tạo chỗ cho việc dịch chuyển 36 sau 24 cu u du o ng th an co ng Phỏng theo cách làm người chơi cần "chèn" thêm vào xếp tay NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt 13 .c om Sắp xếp chèn (Insertion sort) Để chèn 12, ta cần tạo chỗ cho việc dịch chuyển 36 sau 24 cu u du o ng th an co ng Phỏng theo cách làm người chơi cần "chèn" thêm vào xếp tay NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt 14 .c om Sắp xếp chèn (Insertion sort) Để chèn 12, ta cần tạo chỗ cho việc dịch chuyển 36 sau 24 cu u du o ng th an co ng Phỏng theo cách làm người chơi cần "chèn" thêm vào xếp tay NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt 15 Sắp xếp chèn (Insertion sort) cu u du o ng th an co ng c om Thuật tốn: • Mảng cần xếp chia làm phần, sorted unsorted: – Những phần tử nằm phần sorted: xếp – Những phần tử nằm phần unsorted: chưa xếp • Mỗi bước lặp: phần tử thuộc phần unsorted chuyển sang phần sorted  Mảng có n phần tử cần n-1 bước lặp để xếp xong 16 CuuDuongThanCong.com https://fb.com/tailieudientucntt Sắp xếp chèn (Insertion sort) ng c om • Thuật tốn: – Tại bước k =1, 2, , n: đưa phần tử thứ k mảng cho vào vị trí dãy gồm k phần tử an co Tại bước lặp k, cần nhiều lần hốn đổi vị trí phần tử để đưa phần tử thứ k vị trí dãy cần xếp cu u du o ng th Bước lặp k: liên tục đổi chỗ phần tử thứ k với phần tử kề bên trái (phần tử trước) chừng phần tử thứ k nhỏ phần tử Tính chất: Sau bước lặp k, k phần tử a[1], a[2], …, a[k] 17 thứ tự CuuDuongThanCong.com https://fb.com/tailieudientucntt Cài đặt: Insertion Sort Algorithm k=5: tìm vị trí cho a[5]=14 void insertionSort(int a[], int size); a[1] a[2] a[3] a[4] a[5] a[6] a[7] 13 17 20 28 42 14 23 15 13 17 20 28 42 42 23 15 13 17 20 28 28 42 23 15 13 17 20 20 28 42 23 15 13 17 17 20 28 42 23 15 c om a[0] du o ng th an co ng temp = 14 cu u for (int k = 1; k < size; k++) { int temp = a[k]; int pos = k; /* bước lặp k: liên tục đổi chỗ phần tử thứ k với phần tử kề bên trái chừng phần tử thứ k cịn nhỏ phần tử */ while (pos > && a[pos-1] > temp) { a[pos] = a[pos–1]; pos ; } // end while NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN } CuuDuongThanCong.com https://fb.com/tailieudientucntt Cài đặt: Insertion Sort Algorithm k=5: tìm vị trí cho a[5]=14 void insertionSort(int a[], int size); a[1] a[2] a[3] a[4] a[5] a[6] a[7] 13 17 20 28 42 14 23 15 13 17 20 28 42 42 23 15 13 17 20 28 28 42 23 15 13 17 20 20 28 42 23 15 13 17 17 20 28 42 23 15 13 14 17 20 28 42 23 15 c om a[0] du o ng th an co ng temp = 14 cu u for (int k = 1; k < size; k++) { int temp = a[k]; int pos = k; /* bước lặp k: liên tục đổi chỗ phần tử thứ k với phần tử kề bên trái chừng phần tử thứ k nhỏ phần tử */ while (pos > && a[pos-1] > temp) { a[pos] = a[pos–1]; pos ; } // end while // Chèn giá trị temp (=a[k]) vào vị trí NGUYỄN KHÁNH PHƯƠNG a[pos] = temp; Bộ mơn KHMT – ĐHBK HN } CuuDuongThanCong.com https://fb.com/tailieudientucntt cu u du o ng th an co ng c om Cài đặt: Insertion Sort Algorithm NGUYỄN KHÁNH PHƯƠNG Bộ môn KHMT – ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt 20 ... khóa học cu u du o ng th an co ng c om Chương Các khái niệm Chương Các sơ đồ thuật toán Chương Các cấu trúc liệu Chương Cây Chương Sắp xếp Chương Tìm kiếm Chương Đồ thị CuuDuongThanCong.com https://fb.com/tailieudientucntt... 1) ta có thuật tốn tốt thuật toán xếp dựa vào phép so sánh (Thuật tốn thời gian tuyến tính: xếp đếm (couting-sort), xếp theo số (radixsort), xếp đóng gói (bucket-sort)) NGUYỄN KHÁNH PHƯƠNG Bộ... a[1] a[2] a[3] a[4] a [5] a[6] a[7] 13 17 20 28 42 14 23 15 13 17 20 28 42 42 23 15 13 17 20 28 28 42 23 15 13 17 20 20 28 42 23 15 13 17 17 20 28 42 23 15 13 14 17 20 28 42 23 15 c om a[0] du o ng

Ngày đăng: 27/02/2023, 07:57