You are on page 1of 39

BÀI THUYẾT TRÌNH

CÁC KỸ THUẬT SẮP XẾP VÀ TÌM KIẾM

LOGO
LOGO
THÀNH VIÊN NHÓM 13 1

1 Đào Quang Mạnh

2 Nguyễn Tiến Mạnh

3 Đinh Viết Tùng

4 Phí Thanh Bắc

5 Vũ Đình Hiếu

6 Mai Văn Chí


LOGO
GIỚI THIỆU CHUNG 2

Một trong những vấn đề quan trọng bậc nhất của khoa học
máy tính là bài toán tìm kiếm. Có thể nói, hầu hết các hoạt
động của người dùng hoặc các ứng dụng tin học có thể triển
khai được đều liên quan đến tìm kiếm. Bài toán tìm kiếm có
thể được phát biểu như sau:

Bài toán tìm kiếm: Cho dãy gồm n đối tượng R1, R2, .., Rn.
Mỗi đối tượng Ri được tương ứng với một khóa Ki (1≤i ≤n).
Nhiệm vụ của tìm kiếm là xây dựng thuật toán tìm đối tượng
có giá trị khóa là X cho trước. X còn được gọi là khóa tìm
kiếm hay tham biến tìm kiếm (arrgument).
• Nếu tìm thấy đối tượng có khóa X thì ta nói phép tìm kiếm
thành công (successful).
• Nếu không tìm thấy đối tượng có khóa X thì ta nói phép
tìm kiếm không thành công (unsuccessful).
LOGO
GIỚI THIỆU CHUNG 3

Sắp xếp là phương pháp bố trí lại các đối tượng theo một
trật tự nào đó. Ví dụ bố trí theo thứ tự tăng dần hoặc giảm
dần đối với dãy số, bố trị theo thứ tự từ điển đối với các xâu
ký tự. Mục tiêu của sắp xếp là để lưu trữ và tìm kiếm đối
tượng (thông tin) để đạt hiệu quả cao trong tìm kiếm. Có thể
nói, sắp xếp là sân sau quả quá trình tìm kiếm. Bài toán sắp
xếp có thể được phát biểu như sau:

Bài toán sắp xếp: Cho dãy gồm n đối tượng r1, r2, .., rn. Mỗi
đối tượng ri được tương ứng với một khóa ki (1≤i ≤n).
Nhiệm vụ của sắp xếp là xây được tương ứng với một khóa
ki (1≤i ≤n). Nhiệm vụ của sắp xếp là xây dựng thuật toán bố
trí các đối tượng theo một trật tự nào đó của các giá trị
khóa.
LOGO
PHẦN I: SẮP XẾP 4

1 Các Giải Thuật Sắp Xếp Đơn Giản

2 Sắp Xếp Nhanh (Quick Sort)

3 Sắp Xếp Vun Đống (Heap Sort)

4 Sắp Xếp Trộn (Merge Sort)


LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 5

1.1 Sắp xếp kiểu lựa chọn (Selection Sort)

Đây là một trong những giải thuật sắp xếp đơn giản nhất. Ý
tưởng của giải thuật như sau:

 Lựa chọn phần tử có giá trị nhỏ nhất, đổi chỗ cho phần
tử đầu tiên.

 Tiếp theo, lựa chọn phần tử có giá trị nhỏ thứ nhì, đổi
chỗ cho phần tử thứ 2. Quá trình tiếp tục cho tới khi toàn
bộ dãy được sắp.
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 6

VD

B1: Chọn được phần tử nhỏ nhất là 06, đổi chỗ cho 32

B2: Chọn được phần tử nhỏ thứ nhì là 17, giữ nguyên

B3: Chọn được phần tử nhỏ thứ ba là 25, đổi chỗ cho 49

Cứ như vậy cho đến phần tử cuối cùng ta được dãy


LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 7

1.1 Sắp xếp kiểu lựa chọn (Selection Sort)


CODE
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 8

1.2 Sắp xếp kiểu chèn (Insertion Sort)

Giải thuật này coi như dãy được chia làm 2 phần. Phần
đầu là các phần tử đã được sắp. Từ phần tử tiếp theo,
chèn nó vào vị trí thích hợp tại nửa đã sắp sao cho nó vẫn
được sắp.
Để chèn phần tử vào nửa đã sắp, chỉ cần dịch chuyển các
phần tử lớn hơn nó sang trái 1 vị trí và đưa phần tử này
vào vị trí trống trong dãy.
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 9

1.2 Sắp xếp kiểu chèn (Insertion Sort)

Ví dụ, nửa dãy đã sắp là:


06 17 49 98

Để chèn phần tử 32 vào nửa dãy này, ta tiến hành dịch


chuyển các phần tử lớn hơn 32 về bên trái 1 vị trí:
06 17 49 98

Sau đó, chèn 32 vào vị trí trống trong nửa dãy:


06 17 32 49 98
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 10

1.2 Sắp xếp kiểu chèn (Insertion Sort)


CODE
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 11

1.3 Sắp xếp kiểu nổi bọt (Bubble Sort)

Giải thuật sắp xếp nổi bọt được thực hiện theo nguyên tắc:
 Duyệt nhiều lần từ cuối lên đầu dãy, tiến hành đổi chỗ 2
phần tử liên tiếp nếu chúng ngược thứ tự.
 Đến một bước nào đó, khi không có phép đổi chỗ nào
xảy ra thì toàn bộ dãy đã được sắp.
Sau lần duyệt đầu tiên, phần tử nhỏ nhất của dãy sẽ lần
lượt được đổi chỗ cho các phần tử lớn hơn và “nổi” lên đầu
dãy. Lần duyệt thứ 2, phần tử nhỏ thứ 2 sẽ nổi lên vị trí thứ
nhì dãy .v.v
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 12

1.3 Sắp xếp kiểu nổi bọt (Bubble Sort)


Với dãy số ban đầu, Bước 1: Khi duyệt từ cuối dãy lên, lần
lượt xuất hiện các cặp ngược thứ tự là (06, 98), (06, 49),
(06, 17), (06, 32). Phần tử 06 “nổi” lên đầu dãy.
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 13

1.3 Sắp xếp kiểu nổi bọt (Bubble Sort)


Bước 2: Duyệt từ cuối dãy lên, lần lượt xuất hiện các cặp
ngược thứ tự là (25, 98), (25, 49), (17, 32). Phần tử 17 nổi
lên vị trí thứ 2.
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 14

1.3 Sắp xếp kiểu nổi bọt (Bubble Sort)


Bước 3: Duyệt từ cuối dãy lên, lần lượt xuất hiện các cặp
ngược thứ tự là (53, 98), (25, 32). Phần tử 25 nổi lên vị trí
thứ 3.
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 15

1.3 Sắp xếp kiểu nổi bọt (Bubble Sort)

Bước 4: Duyệt từ cuối dãy lên,


xuất hiện cặp ngược thứ tự là
(61, 98).

Bước 5: Duyệt từ cuối dãy lên,


không còn xuất hiện cặp ngược
nào. Toàn bộ dãy đã được sắp.
LOGO
1. Các Giải Thuật Sắp Xếp Đơn Giản 16

1.3 Sắp xếp kiểu nổi bọt (Bubble Sort)


CODE
LOGO
2. Sắp Xếp Nhanh (Quick Sort) 17

2.1 Giới thiệu thuật toán

Thuật toán sắp xếp Quick-Sort được thực hiện theo mô


hình chia để trị. Thuật toán được thực hiện xung quanh một
phần tử chốt (key). Mỗi cách lựa chọn vị trí phần tử chốt
trong dãy sẽ cho một phiên bản khác nhau của thuật toán.
Các phiên bản của thuật toán Quick-Sort thông dụng là:
 Luôn lựa chọn phần tử đầu tiên trong dãy làm chốt.
 Luôn lựa chọn phần tử cuối cùng trong dãy làm chốt.
 Luôn lựa chọn phần tử ở giữa dãy làm chốt.
 Lựa chọn phần tử ngẫu nhiên trong dãy làm chốt.
LOGO
2. Sắp Xếp Nhanh (Quick Sort) 18

2.1 Giới thiệu thuật toán

Mấu chốt của Quick-Sort là làm thế nào ta xây dựng được
một thủ tục phân đoạn (Partition). Thủ tục Partition có hai
nhiệm vụ chính:
 Định vị vị trí của chốt trong dãy nếu được sắp xếp;
 Chia dãy ban đầu thành hai dãy con: dãy con phía trước
phần tử chốt bao gồm các phần tử nhỏ hơn hoặc bằng
chốt, dãy ở phía sau chốt có giá trị lớn hơn chốt.
Có nhiều thuật toán khác nhay để xây dựng thủ tục
Partition, dưới đây là một phương pháp xây dựng thủ tục
Partion với khóa chốt là phần tử cuối cùng của dãy.
LOGO
2. Sắp Xếp Nhanh (Quick Sort) 19

2.2 Thuật toán Partition:

Input:
• Dãy Arr[] bắt đầu tại vị
trí l và kết thúc tại h.
• Cận dưới của dãy
con: l
• Cận trên của dãy con:
h
Output:
• Vị trí chính xác
củaArr[h] nếu dãyArr[]
được sắp xếp.
LOGO
2. Sắp Xếp Nhanh (Quick Sort) 20

2.3 Cài đặt thuật toán Quick Sort:

Input:
• Dãy Arr[] gồm n
phần tử.
• Cận dưới của
dãy: l
• Cận trên của
dãy: h
Output:
• DãyArr[] được
sắp xếp
LOGO
3. Sắp Xếp Vun Đống (Heap Sort) 21

3.1 Giới thiệu thuật toán

Heap-Sort được thực hiện dựa trên cấu trúc dữ liệu Heap.
Nếu ta muốn sắp xếp theo thứ tự tăng dần ta sử dụng cấu
trúc Max Heap, ngược lại ta sử dụng cấu trúc Min-Heap. Vì
Heap là một cây nhị phân đầy đủ nên việc biểu diễn Heap
một cách hiệu quả có thể thực hiện được bằng mảng.

Heap Sort giống như Selection Sort, chọn phần tử lớn nhất
trong dãy đặt vào vị trí cuối cùng, sau đó lặp lại quá trình
này cho các phần tử còn lại. Điểm khác biệt ở đây là phần
tử lớn nhất của Heap luôn là phần tử đầu tiên trên Heap.
LOGO
3. Sắp Xếp Vun Đống (Heap Sort) 22

3.1 Giới thiệu thuật toán

Các bước
 Xây dựng Max Heap từ dữ liệu vào. Ví dụ với dãy A[] =
{9, 7, 12, 8, 6, 5} thì Max Heap được xây dựng làA[] =
{12, 8, 9, 7, 6, 5}.
 Bắt đầu tại vị trí đầu tiên là phần tử lớn nhất của dãy.
Thay thế, phần tử này cho phần tử cuối cùng ta nhận
được dãyA[] = {5, 8, 9, 7, 6, 12}.
 Xây dựng lại Max Heap cho n-1 phần tử đầu tiên của dãy
và lặp lại quá trình này cho đến khi Heap chỉ còn lại 1
phần tử.
LOGO
3. Sắp Xếp Vun Đống (Heap Sort) 23

3.2 Thuật toán xây dựng Heap Sort

Các bước
 Xây dựng Max Heap từ dữ liệu vào. Ví dụ với dãy A[] =
{9, 7, 12, 8, 6, 5} thì Max Heap được xây dựng làA[] =
{12, 8, 9, 7, 6, 5}.
 Bắt đầu tại vị trí đầu tiên là phần tử lớn nhất của dãy.
Thay thế, phần tử này cho phần tử cuối cùng ta nhận
được dãyA[] = {5, 8, 9, 7, 6, 12}.
 Xây dựng lại Max Heap cho n-1 phần tử đầu tiên của dãy
và lặp lại quá trình này cho đến khi Heap chỉ còn lại 1
phần tử.
LOGO
3. Sắp Xếp Vun Đống (Heap Sort) 24

3.2 Cài đặt thuật toán Heap Sort


LOGO
4. Sắp Xếp Trộn (Merge Sort) 25

4.1 Giới thiệu thuật toán

Giống như Quick-Sort, Merge-Sort cũng được xây dựng


theo mô hình chia để trị (Devide and Conquer). Thuật toán
chia dãy cần sắp xếp thành hai nửa. Sau đó gọi đệ qui lại
cho mỗi nửa và hợp nhất lại các đoạn đã được sắp xếp.
Thuật toán được tiến hành theo 4 bước:
 Tìm điểm giữa của dãy và chi dãy thành hai nửa.
 Thực hiện Merge-Sort cho nửa thứ nhất.
 Thực hiện Merge-Sort cho nửa thứ hai.
 Hợp nhất hai đoạn đã được sắp xếp.
LOGO
4. Sắp Xếp Trộn (Merge Sort) 26

4.1 Giới thiệu thuật toán

Thuật toán Merge-Sort là làm thế nào ta xây dựng được


một thủ tục hợp nhất (Merge). Thủ tục Merge thực hiện hòa
nhập hai dãy đã được sắp xếp để tạo thành một dãy cũng
được sắp xếp. Bài toán có thể được phát biểu như sau:

Bài toán hợp nhất Merge: Cho hai nửa của một dãy
Arr[1,..,m] và A[m+1,..,r] đã được sắp xếp. Nhiệm vụ của ta
là hợp nhất hai nửa của dãy Arr[1,..,m] và Arr[m+1,..,r] để
trở thành một dãy Arr[1, 2,..,r] cũng được sắp xếp.
LOGO
4. Sắp Xếp Trộn (Merge Sort) 27

4.2 Thuật toán Merge


LOGO
4. Sắp Xếp Trộn (Merge Sort) 28

4.3 Cài đặt thuật toán Merge Sort

Input:
• Dãy các đối tượng (các số): Arr[0],Arr[1],..,Arr[n-1].
• Số lượng các đối tượng cần sắp xếp: n.
Output:
• Dãy các đối tượng đã được sắp xếp (các số) :Arr[0],Arr[1],..,Arr[n-1].

CODE
LOGO
PHẦN II: TÌM KIẾM 29

1 Tìm Kiếm Tuần Tự

2 Tìm Kiếm Nhị Phân

3 Cây Nhị Phân Tìm Kiếm


LOGO
1. Tìm Kiếm Tuần Tự 30

1.1 Giới thiệu thuật toán và cài đặt

Tìm kiếm đối tượng có giá trị khóa x trong tập các khóa A =
{a1, a2,.., an} là phương pháp so sánh tuần tự x với các
khóa {a1, a2,.., an}. Thuật toán trả lại vị trí của x trong dãy
khóa A = {a1, a2,.., an}, trả lại giá trị -1 nếu x không có mặt
trong dãy khóa A = {a1, a2,.., an}.

CODE
LOGO
1. Tìm Kiếm Tuần Tự 31

1.2 Ví dụ

Input :
• A[] = { 9, 7, 12, 8, 6, 5}
• x = 13
Output:
• Sequential-Search(A, n, x) = -1

Input :
• A[] = {9, 7, 12, 8, 6, 5}
• x=6
Output:
• Sequential-Search(A, n, x) = 4
LOGO
2. Tìm Kiếm Nhị Phân 32

2.1 Giới thiệu thuật toán

Tìm kiếm nhị phân là phương pháp định vị phần tử x trong


một danh sách A[] gồm n phần tử đã được sắp xếp. Quá
trình tìm kiếm bắt đầu bằng việc chia danh sách thành hai
phần. Sau đó, so sách x với phần từ ở giữa.
LOGO
2. Tìm Kiếm Nhị Phân 33

2.1 Giới thiệu thuật toán

Khi đó có 3 trường hợp có thể xảy ra:


 Nếu x bằng phần tử ở giữa A[mid], thì mid chính là vị trí
của x trong danh sáchA[].
 Nếu x lớn hơn phần tử ở giữa thì nếu x có mặt trọng
dãyA[] thì ta chỉ cần tìm các phần tử từ mid+1 đến vị trí
thứ n.
 Nếu x nhỏ hơn A[mid] thì x chỉ có thể ở dãy con bên trái
của dãyA[].
LOGO
2. Tìm Kiếm Nhị Phân 34

2.1 Giới thiệu thuật toán

Lặp lại quá trình trên cho đến khi cận dưới vượt cận trên
của dãy A[] mà vẫn chưa tìm thấy x thì ta kết luận x không
có mặt trong dãyA[].
LOGO
2. Tìm Kiếm Nhị Phân 35

2.2 Cài đặt thuật toán


LOGO
3. Cây Nhị Phân Tìm Kiếm 36

3.1 Giới thiệu thuật toán

Cây nhị phân tìm kiếm được xây dựng dựa vào cấu trúc dữ
liệu cây, trong đó nội dung của node thuộc nhánh cây con
trái nhỏ hơn nội dung node gốc và nội dung thuộc nhánh
cây con bên phải lớn hơn nội dung node gốc. Hai cây con
bên trái và bên phải cũng hình thành nên một cây nhị phân
tìm kiếm.
LOGO
3. Cây Nhị Phân Tìm Kiếm 37

3.2 Cài đặt thuật toán


CẢM
CẢM ƠNƠN
THẦY THẦY
VÀ CÁC BẠN!

VÀ CÁC BẠN ĐÃ LẮNG NGHE


LOGO

You might also like