Professional Documents
Culture Documents
Slide Nhóm 13 - Sắp Xếp
Slide Nhóm 13 - Sắp Xếp
LOGO
LOGO
THÀNH VIÊN NHÓM 13 1
5 Vũ Đình Hiếu
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
Đâ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
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
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
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
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
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
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
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
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
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
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
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
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
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