1. Trang chủ
  2. » Công Nghệ Thông Tin

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 - Nguyễn Tri Tuấn

103 30 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

Thông tin cơ bản

Định dạng
Số trang 103
Dung lượng 1,42 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 trình bày các kiến thức về sắp xếp 1 mảng các số nguyên, selection sort algorithm, insertion sort algorithm, thuật toán “Shell sort, đánh giá thuật toán,... Mời các bạn cùng tham khảo.

Trang 1

Các thut toán sp x ế p

(Sorting algorithms)

Nguy ễ n Tri Tu ấ n Khoa CNTT – Đ H.KHTN.Tp.HCM Email: nttuan@fit.hcmus.edu.vn

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 2

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 2

Trang 3

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 3

Thuật toán “Chọn trực tiếp”

(Selection sort Algorithm)

Thuật toán “Chọn trực tiếp”

(Selection sort Algorithm)

Trang 4

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 4

Selection sort Algorithm

Trang 5

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 5

Selection sort Algorithm

Trang 6

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 6

Selection sort Algorithm

Trang 7

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 7

Selection sort Algorithm

Trang 8

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 8

Selection sort Algorithm

Trang 9

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 9

Selection sort Algorithm

Trang 10

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 10

Selection sort Algorithm

Trang 11

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 11

Selection sort Algorithm

 Tiếp tục

tương tự

Ph ần đ ã sắp tăng thêm

[0] [1] [2] [3] [4] [5]

Phần đã sắp Phần chưa sắp

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 12

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 12

Selection sort Algorithm

Trang 13

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 13

Selection sort Algorithm

Trang 14

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 14

Selection sort Algorithm

Trang 15

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 15

Selection sort Algorithm

(Minh họa chương trình)

Selection sort Algorithm

(Minh họa chương trình)

void SelectionSort (int a[ ], int n )

{

int min; // vị trí của phần tử nhỏ nhất (trong phần chưa sắp)

int tmp; // biến tạm dùng khi hoán vị

for (int i = 0; i < n; i++ ) {

// tìm phần tử nhỏ nhất trong phần chưa sắp min = i;

for (int j = i + 1; j < n; j++)

if (a[j] < a[min] ) min = j;

// hoán vị phần tử nhỏ nhất được tìm thấy với phần tử đầu

if (a[min] < a[i]) { tmp = a[i]; a[i] = a[min]; a[min] = tmp; } } // end of for i

}

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 16

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 16

Đánh giá thuật toán

(Selection sort Algorithm)

Đánh giá thuật toán

(Selection sort Algorithm)

 Trong mọi trường hợp, số phép so sánh là:

Trang 17

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 17

Thuật toán “Chèn trực tiếp”

(Insertion sort Algorithm)

Thuật toán “Chèn trực tiếp”

(Insertion sort Algorithm)

Trang 18

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 18

Insertion sort Algorithm

Trang 19

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 19

Insertion sort Algorithm

Trang 20

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 20

Insertion sort Algorithm

Trang 21

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 21

Insertion sort Algorithm

Trang 22

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 22

Insertion sort Algorithm

Trang 23

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 23

Insertion sort Algorithm

Trang 24

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 24

Insertion sort Algorithm

Trang 25

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 25

Insertion sort Algorithm

Trang 26

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 26

Insertion sort Algorithm

Trang 27

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 27

Insertion sort Algorithm

Trang 28

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 28

Insertion sort Algorithm

Trang 29

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 29

Insertion sort Algorithm

Trang 30

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 30

Insertion sort Algorithm

Trang 31

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 31

Insertion sort Algorithm

Trang 32

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 32

Insertion sort Algorithm

Trang 33

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 33

Insertion sort Algorithm

Trang 34

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 34

Insertion sort Algorithm

Trang 35

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 35

Insertion sort Algorithm

(Minh họa chương trình)

Insertion sort Algorithm

(Minh họa chương trình)

void InsertionSort (int a[ ], int n)

Trang 36

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 36

Đánh giá thuật toán

(Insertion sort Algorithm)

Đánh giá thuật toán

(Insertion sort Algorithm)

Trang 37

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 37

 “Ch èn trực tiếp” và “Chọn trực tiếp” đều có chi phí cho trường hợp xấu nhất là O(n 2 )

 Do đó, không thích hợp cho việc sắp xếp các

mảng lớn

 D ễ cài đặt, dễ kiểm lỗi

 “Ch èn trực tiếp” tốt hơn “Chọn trực tiếp”,

Trang 38

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 38

Thuật toán “Shell sort”

(Shell sort Algorithm)

Thuật toán “Shell sort”

(Shell sort Algorithm)

Shell trên tạp chí Communication of the

ACM

 Thuật toán này cải tiến hiệu quả của thuật

toán “Chèn trực tiếp”

 Phá vỡ rào cản chi phí O(n 2 ) của những

thuật toán sắp xếp trước đó

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 39

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 39

Shell sort Algorithm

Trang 40

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 40

Shell sort Algorithm

Trang 41

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 41

Shell sort Algorithm

 Chia dãy thành h=3 dãy con

 Sắp xếp 3 dãy con bằng phương pháp “Chèn trực tiếp”

Trang 42

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 42

Shell sort Algorithm

 Sắp xếp 1 dãy con bằng phương pháp “Chèn trực tiếp”

Trang 43

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 43

Shell sort Algorithm

 Thuật toán sử dụng 1 dãy h k :

h 1 , h 2 , h 3 , …, h t

 (*) Tính chất dãy h k :

 h i > h i+1 (dãy giảm dần)

 h t = 1

 Dãy h k gọi là dãy “gia số” (Increment sequence),

dùng để tạo lập các dãy con trong mảng ban đầu

 Trong ví dụ: h 1 = 5, h 2 = 3, h 3 = 1

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 44

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 44

Shell sort Algorithm

 Vấn đề: Lựa chọn dãy gia số h k như thế nào ?

 Mọi dãy h k thoả mãn tính chất (*) đều chấp nhận được;

 Tuy nhiên, cho đến nay, người ta chỉ có thể chỉ ra rằng dãy h k này tốt hơn dãy h k kia, chứ không thể xác định được dãy nào là tốt nhất

 Chi phí c ủ a thu ậ t toán Shell sort ph ụ

th ụ ôc vào 2 v ấ n đề chính là :

 Cách thức xây dựng dãy h k

 Dữ liệu nhập

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 45

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 45

Shell sort Algorithm

 Các chiến lược xây dựng dãy h k đã được khảo sát:

Trang 46

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 46

Shell sort Algorithm

(Minh họa chương trình)

Shell sort Algorithm

(Minh họa chương trình)

void ShellSort(int h[], int a[], int t, int n)

{

for (int k=0; k<t; k++) {

int increment = h[k];

for (int i=increment; i<n; i++) {

int saved = a[i];

for (int j=i; j>=increment && saved<a[j-increment];

j-=increment) a[j] = a[j-increment];

a[j] = saved;

} }

}

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 47

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 47

Đánh giá thuật toán

(Shell sort Algorithm)

Đánh giá thuật toán

(Shell sort Algorithm)

 Việc phân tích giải thuật này đặt ra những vấn đề toán học hết sức phức tạp mà trong đó có 1 số vấn

đề đến nay vẫn chưa được giải quyết

 Ngườ i ta vẫn chưa biết chọn dãy h k như thế nào

là phù hợp để cho ra kết quả tốt nhất

 Một số kết quả đã chứng minh:

 Shell sort với dãy h k của Donald Shell có số phép gán

trong tr ườ ng h ợ p x ấ u nh ấ t là O(n 2 )

 Sử dụng dãy h k của Hibbard cần dùng O(n 3/2 ) phép gán

 Chi phí khi dùng dãy h k của Pratt là O(n(log 2 n) 2 )

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 48

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 48

Thuật toán “Sắp xếp cây”

(Heap sort Algorithm)

Thuật toán “Sắp xếp cây”

(Heap sort Algorithm)

trên tạp chí Communication of the ACM

 Đây là thuật toán sắp xếp chậm nhất trong số các

thuật toán có độ phức tạp O(n*log 2 n)

 Nhưng nó lại đạt được ưu điểm vì tính đơn giản

của cài đặt không đòi hỏi vòng đệ qui phức tạp

như của Quicksort và không sử dụng mảng phụ

như Mergesort

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 49

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 49

Heap sort Algorithm

Nội dung

Heap sort Algorithm

Nội dung

 Biểu diễn Heap bằng mảng (array)

 Thao tác cơ bản trên Heap

 Thuật toán Heap sort

 Đánh giá thuật toán

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 50

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 50

Heap sort Algorithm

21 27

23

45

35

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 51

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 51

Heap sort Algorithm

21 27

Trang 52

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 52

Heap sort Algorithm

Trang 53

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 53

Heap sort Algorithm

Biểu diễn Heap bằng mảng

Heap sort Algorithm

Biểu diễn Heap bằng mảng

 Ta sẽ lưu giá trị

của các nút trong

một array

21 27

23

42

35

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 54

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 54

Heap sort Algorithm

Biểu diễn Heap bằng mảng

Heap sort Algorithm

Biểu diễn Heap bằng mảng

Trang 55

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 55

Heap sort Algorithm

Biểu diễn Heap bằng mảng

Heap sort Algorithm

Biểu diễn Heap bằng mảng

 Giá trị của hai nút

con của gốc được

điền vào hai vị trí

tiếp theo

21 27

Trang 56

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 56

Heap sort Algorithm

Biểu diễn Heap bằng mảng

Heap sort Algorithm

Biểu diễn Heap bằng mảng

 Giá trị của hai nút ở

Trang 57

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 57

Heap sort Algorithm

Biểu diễn Heap bằng mảng

Heap sort Algorithm

Biểu diễn Heap bằng mảng

 Liên kết giữa các nút được

hiểu ngầm, không trực tiếp

Trang 58

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 58

Heap sort Algorithm

Biểu diễn Heap bằng mảng

Heap sort Algorithm

Biểu diễn Heap bằng mảng

 Nếu ta biết được chỉ số của

Trang 59

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 59

Heap sort Algorithm

Biểu diễn Heap bằng mảng

Heap sort Algorithm

Biểu diễn Heap bằng mảng

 Nút gốc ở chỉ số [0]

 Nút cha của nút [i] có chỉ số là [(i-1)/2]

 Các nút con của nút [i] (nếu có) có chỉ số

Trang 60

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 60

Heap sort Algorithm

Thao tác cơ bản trên Heap

Heap sort Algorithm

Thao tác cơ bản trên Heap

21 35

Trang 61

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 61

Heap sort Algorithm

Thao tác cơ bản trên Heap

Heap sort Algorithm

Thao tác cơ bản trên Heap

21 27

Trang 62

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 62

Heap sort Algorithm

Thao tác cơ bản trên Heap

Heap sort Algorithm

Thao tác cơ bản trên Heap

4 22

21 34

23

42

35

28 27

 Heapify - Điều chỉnh 1 phần tử

 Hoàn tất !

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 63

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 63

Heap sort Algorithm

Thao tác cơ bản trên Heap

Heap sort Algorithm

Thao tác cơ bản trên Heap

void Heapify(int a[], int n, int i) // Điều chỉnh phần tử a[i]

{

int saved = a[i]; // lưu lại giá trị của nút i

while (i < n/2) { // a[i] không phải là nút lá

int child = 2*i + 1; // nút con bên trái của a[i]

if (child < n-1)

if (a[child] < a[child+1]) child ++;

if (saved >= a[child]) break;

Trang 64

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 64

Heap sort Algorithm

Thuật toán Heap sort

Heap sort Algorithm

Thuật toán Heap sort

 Xây dựng Heap: Sử dụng thao tác Heapify

để chuyển đổi một mảng bình thường thành

Heap

 Sắp xếp:

 Hoán vị phần tử cuối cùng của Heap với phần

tử đầu tiên của Heap (có giá trị lớn nhất)

 Loại bỏ phần tử cuối cùng

 Thực hiện thao tác Heapify để điều chỉnh phần

tử đầu tiên

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 65

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 65

Heap sort Algorithm

Thuật toán Heap sort - Xây dựng Heap

Heap sort Algorithm

Thuật toán Heap sort - Xây dựng Heap

 Tất cả các phần tử trên mảng có chỉ số [n/2]

đến [n-1] đều là nút lá

 Mỗi nút lá được xem là Heap có một phần tử

 Thực hiện thao tác Heapify trên các phần tử

có chỉ số từ [n/2]-1 đến [0]

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 66

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 66

Heap sort Algorithm

Thuật toán Heap sort - Xây dựng Heap

Heap sort Algorithm

Thuật toán Heap sort - Xây dựng Heap

 Thực hiện Heapify với tất

cả các nút không phải là lá

 Theo thứ tự từ trái sang

phải

17 14

Trang 67

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 67

Heap sort Algorithm

Thuật toán Heap sort - Xây dựng Heap

Heap sort Algorithm

Thuật toán Heap sort - Xây dựng Heap

Trang 68

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 68

Heap sort Algorithm

Thuật toán Heap sort - Sắp xếp

Heap sort Algorithm

Thuật toán Heap sort - Sắp xếp

void HeapSort(int a[], int n)

{

BuildHeap(a, n);

for (int i=n-1; i>=0; i ) {

Hoán vị a[0] với a[i]

Heapify(a, i, 0);

} }

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Trang 69

Spring 2009 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 69

Đánh giá thuật toán

(Heap sort Algorithm)

Đánh giá thuật toán

(Heap sort Algorithm)

 Heap sort luôn có độ phức tạp là O(n*

log 2 n)

 Quick sort thường có độ phức tạp là O(n* log 2 n) nhưng trường hợp xấu nhất lại có độ phức tạp O(n 2 )

 Nhìn chung Quick sort nhanh hơn Heap sort

2 lần nhưng Heap sort lại có độ ổn định cao trong mọi trường hợp

CuuDuongThanCong.com https://fb.com/tailieudientucntt

Ngày đăng: 02/12/2020, 12:41

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm