Tổng quan về thuật toán Quick Sort A.. phương pháp lặp Sẽ được trình bày cụ thể ở một số thuật toán Sẽ Sẽ được trình bày cụ thể ở một số thuật toán được Sẽ được trình bày cụ thể ở một
Trang 1NHÓM THỰC HIỆN: NHÓM 2
ĐỆ QUY
GVHD: TS.NGUYỄN XUÂN HẢI
Trang 32 Một số bài toán điển hình
A Dãy số Fibonacci
B Bài toán tháp Hà Nội
C Bài toán 8 con hậu
II – KHỬ ĐỆ QUY (QUICK SORT):
3 Tổng quan về thuật toán Quick Sort
A Giới thiệu thuật toán Quick Sort
B Ý tưởng thuật toán Quick Sort
C Giải thuật Quick Sort
D Cài đặt Quick Sort
E Ví dụ
F Hiệu quả thuật toán Quick Sort
Trang 4I TỔNG QUAN VỀ ĐỆ QUY
1 Khái niệm về đệ quy
máy tính Một đối tượng được gọi là đệ quy nếu nó hoặc một phần của nó được định nghĩa thông qua khái niệm về chính nó.
gọi lại chính nó.
Trang 5 Ví dụ:
Định nghĩa số tự nhiên:
• 0 là số tự nhiên.
• Nếu k là số tự nhiên thì k+1 cũng là số tự nhiên.
Định nghĩa xâu kí tự (chuỗi kí tự) bằng đệ quy:
• Xâu rỗng là xâu kí tự
• Một chữ cái bất kì ghép với 1 xâu sẽ tạo thành xâu mới
Định nghĩa hàm giai thừa n!:
• Khi n = 0, định nghĩa 0! = 1
• Khi n>0, định nghĩa n! = (n-1)! * n
Trang 6 Đặc điểm của chương trình đệ quy:
quyết một vấn đề tương tự nhưng nhỏ hơn.
mức chương trình có thể tự giải quyết mà không cần phải gọi chính nó nữa.
I TỔNG QUAN VỀ ĐỆ QUY
1 Khái niệm về đệ quy
Trang 7 Để xây dựng 1 chương trình đệ quy 1 công thức đệ quy.
Công thức này gồm 2 phần:
Trang 8 Ưu điểm của chương trình đệ quy:
thông qua 1 đoạn chương trình ngắn gọn.
qua 1 số hữu hạn lời phát biểu.
Nhược điểm:
được sử dụng trong hàm này như: biến, hằng, cấu trúc… và các thông số cần cho việc chuyển giao điều khiển sẽ được sinh ra
do tính chất tự động gọi thực hiện thủ tục khi chưa kết thúc đệ quy.
I TỔNG QUAN VỀ ĐỆ QUY
1 Khái niệm về đệ quy
Khi nào nên/không nên sử dụng đệ quy?
Nếu chương trình có thể viết dưới dạng lặp hoặc các cấu trúc
Trang 9Minh họa: Chương trình tính giai thừa của một số tự nhiên được cho như sau:
int GT (int N) {
if (N==0) GT=1;
else GT=N*GT(N-1);
}
Tính GT(5)?
Trang 10CT chính: Chưa xong: answer GT(5)
Trang 11CT chính: Chưa xong: answer GT(5)
Trang 12Nhận xét: Kỹ thuật đệ quy:
Kết luận:
khác.
phương pháp lặp Sẽ được trình bày cụ thể ở một số thuật toán Sẽ Sẽ được trình bày cụ thể ở một số thuật toán được Sẽ được trình bày cụ thể ở một số thuật toán trình Sẽ được trình bày cụ thể ở một số thuật toán bày Sẽ được trình bày cụ thể ở một số thuật toán cụ Sẽ được trình bày cụ thể ở một số thuật toán thể Sẽ được trình bày cụ thể ở một số thuật toán ở Sẽ được trình bày cụ thể ở một số thuật toán một Sẽ được trình bày cụ thể ở một số thuật toán số Sẽ được trình bày cụ thể ở một số thuật toán thuật Sẽ được trình bày cụ thể ở một số thuật toán toán Sẽ được trình bày cụ thể ở một số thuật toán
trong Sẽ được trình bày cụ thể ở một số thuật toán những Sẽ được trình bày cụ thể ở một số thuật toán phần Sẽ được trình bày cụ thể ở một số thuật toán sau.
Thuận lợi cho việc biểu
I TỔNG QUAN VỀ ĐỆ QUY
1 Khái niệm về đệ quy
Trang 13A Dãy số Fibonacci
B Bài toán tháp Hà Nội
C Bài toán 8 con hậu
Trang 14I TỔNG QUAN VỀ ĐỆ QUY
2 Một số bài toán điển hình
A Dãy số Fibonacci:
Trang 15A Dãy số Fibonacci (tt):
Phát biểu bài toán:
Dãy số F(n) được cho bởi công thức truy hồi như sau:
Tính số hạng thứ n của dãy?
Trang 17B Bài toán tháp Hà Nội
Phát biểu bài toán:
Có 3 chiếc cọc và bộ n đĩa Các đĩa này có kích
thước khác nhau, các đĩa đều có lỗ để xuyên chúng qua đầu cọc.
Ban đầu các đĩa đều nằm trên 1 cọc, trong đó đĩa nhỏ sẽ nằm trên đĩa lớn.
Yêu cầu: chuyển bộ n đĩa từ cọc ban đầu A sang cọc đích C sao cho vẫn đảm bảo nguyên tắc đĩa nhỏ trên đĩa lớn dưới.
Trang 18A B C
1 đĩa
B Bài toán tháp Hà Nội (tt):
I TỔNG QUAN VÊ ĐỆ QUY
2 Một số bài toán điển hình
Trang 19A B C
2 đĩa
B Bài toán tháp Hà Nội (tt):
Trang 21B Bài toán tháp Hà Nội (tt)
Trang 22Chương trình minh họa bài toán Tháp Hà Nội:
void Sẽ được trình bày cụ thể ở một số thuật toán chuyen(int Sẽ được trình bày cụ thể ở một số thuật toán sodia, Sẽ được trình bày cụ thể ở một số thuật toán char Sẽ được trình bày cụ thể ở một số thuật toán CotNguon, Sẽ được trình bày cụ thể ở một số thuật toán char Sẽ được trình bày cụ thể ở một số thuật toán CotDich, Sẽ được trình bày cụ thể ở một số thuật toán char Sẽ được trình bày cụ thể ở một số thuật toán CotTG)
Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán { Sẽ được trình bày cụ thể ở một số thuật toán
if Sẽ được trình bày cụ thể ở một số thuật toán (sodia>0) Sẽ được trình bày cụ thể ở một số thuật toán {
Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán chuyen( sodia-1 , Sẽ được trình bày cụ thể ở một số thuật toán CotNguon, Sẽ được trình bày cụ thể ở một số thuật toán CotTG , Sẽ được trình bày cụ thể ở một số thuật toán CotDich);
Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán printf(“%c Sẽ được trình bày cụ thể ở một số thuật toán ->%c\n”, Sẽ được trình bày cụ thể ở một số thuật toán CotNguon Sẽ được trình bày cụ thể ở một số thuật toán , Sẽ được trình bày cụ thể ở một số thuật toán CotDich); Sẽ được trình bày cụ thể ở một số thuật toán // Sẽ được trình bày cụ thể ở một số thuật toán Dia Sẽ được trình bày cụ thể ở một số thuật toán lon Sẽ được trình bày cụ thể ở một số thuật toán nhat Sẽ được trình bày cụ thể ở một số thuật toán hien Sẽ được trình bày cụ thể ở một số thuật toán tai Sẽ được trình bày cụ thể ở một số thuật toán
Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán chuyen( sodia-1 , Sẽ được trình bày cụ thể ở một số thuật toán CotTG, Sẽ được trình bày cụ thể ở một số thuật toán CotDich , Sẽ được trình bày cụ thể ở một số thuật toán CotNguon);
Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán }
Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán Sẽ được trình bày cụ thể ở một số thuật toán }
I TỔNG QUAN VỀ ĐỆ QUY
2 Một số bài toán điển hình
B Bài toán tháp Hà Nội (tt):
Trang 23 Phát biểu bài toán: Tìm cách đặt 8 quân hậu trên 1 bàn cờ mà không có 2 quân hậu nào có thể ăn được nhau.
Trang 24 Bài toán 8 quân hậu (mô phỏng)
C Bài toán 8 quân hậu (tt):
I TỔNG QUAN VỀ ĐỆ QUY
2 Một số bài toán điển hình
Trang 25 Bài toán 8 quân hậu (mô phỏng)
Ω4
Trang 26 Bài toán 8 quân hậu (mô phỏng)
Trang 27 Bài toán 8 quân hậu (mô phỏng)
Ω7
Ω6
Ω5
Ω5
Trang 28 Bài toán 8 quân hậu (mô phỏng)
Trang 29 Bài toán 8 quân hậu (mô phỏng)
Trang 30Ω Ω Ω Ω
Ω Ω
Ω Ω
2 Một số bài toán điển hình
Bài toán 8 quân hậu (mô phỏng): một kết quả
Trang 32II KHỬ ĐỆ QUY (QUICK SORT) 1.Tổng quan về thuật toán Quick Sort
A - Giới thiệu thuật toán Quick Sort:
Hoare.
sử dụng ít tài nguyên hơn các phương pháp khác.
Trang 33 Để sắp xếp dãy , giải thuật Quicksort dựa vào việc phân hoạch dãy ban đầu thành 2 dãy con:
Dãy con 1: Gồm các phần tử có giá trị không lớn hơn x.
Dãy con 2: Gồm các phần tử có giá trị không nhỏ hơn x.
(x là giá trị của 1 phần tử tùy ý trong dãy ban đầu)
ak ≤ x ak ≥ x
Trang 34Nhận xét:
dãy ban đầu đã được sắp
chỉ có thứ tự khi các đoạn 1, 3 được sắp Ta tiếp tục
II KHỬ ĐỆ QUY (QUICK SORT)
1 Tổng quan về thuật toán Quick Sort
B - Ý tưởng thuật toán Quick Sort (tt):
k ≥ x
ak = x
Trang 35 Bước 1: Nếu left ≥ right //dãy có ít hơn 2 phần tử
Kết thúc; //dãy đã được sắp xếp
Bước 2: Phân hoạch dãy aleft … aright thành các đoạn: aleft aj, ai aright
Đoạn 1: aleft … aj x Đoạn 2: aj+1…ai-1=x Đoạn 3: ai aright ≥ x
Bước 3: Sắp xếp đoạn 1: aleft aj //quay lại bước 1
Bước 4: Sắp xếp đoạn 3: a a //quay lại bước 1
Trang 36C - Giải thuật Quick Sort (tt):
Giải thuật phân hoạch dãy , thành 2 dãy con (Sử dụng trong bước 2)
left.
x = a[k]; i=left; j=right;
chổ:
Bước 2.2a: Trong khi (a[i] < x) i++;
Bước 2.2b: Trong khi (a[j] >x ) j ;
Bước 2.2c: Nếu i ≤ j //a[i] a[j] mà a[j] đứng sau a[i]
Hoán vị (a[i],a[j]); i++; j ;
II KHỬ ĐỆ QUY (QUICK SORT)
1 Tổng quan về thuật toán Quick Sort
Trang 37 Về nguyên tắc, có thể chọn giá trị mốc x (a[k]) là một phần tử tùy ý trong dãy, nhưng để đơn giản, dễ diễn đạt giải thuật, phần tử có vị trí giữa thường được chọn, khi
đó k=(left+right)/2.
Giá trị mốc x được chọn sẽ có tác động đến hiệu quả thực hiện thuật toán vì nó quyết định số lần phân hoạch:
Số lần phân hoạch sẽ ít nhất nếu ta chọn được x là phần tử median của dãy Tuy nhiên do chi phí xác định phần tử
median quá cao nên trong thực tế người ta không chọn phần
tử này mà chọn phần tử nằm chính giữa dãy làm mốc với hi
Trang 38D - Cài đặt Quick Sort
void QuickSort(int a[],int left,int right){
swap(a[i],a[j]); i++; j ;
} }while(i<=j);
if(left<j) QuickSort(a,left,j);
II KHỬ ĐỆ QUY (QUICK SORT)
1 Tổng quan về thuật toán Quick Sort
Trang 395 3 6 7 12 4 10 1
1 2 3 4 5 6 7 8 left
right
Trang 405 3 6 7 12 4 10 1
Trang 415 3 6 7 12 4 10 1
1 2 3 4 5 6 7 8
1 Phân hoạch đoạn left = 1, right = 8
Bước 1: Kiểm tra (left≥ right)?
Bước 2: x=a[(left+right)/2]=a[4]=6; i=left=1; j=right=8
6
Trang 425 3 4 7 12 6 10 1
1 2 3 4 5 6 7 8
5
1.1 Phân hoạch đoạn left= 1, right= j=4 (left, j của 1)
Bước 1: Kiểm tra (left≥ right)?
Bước 2: x=a[(left+right)/2]=a[2]=5; i=left=1; j=right=4
II KHỬ ĐỆ QUY (QUICK SORT)
1 Tổng quan về thuật toán Quick Sort
E - Ví dụ (tt):
Trang 434 3 5 7 12 6 10 1
1 2 3 4 5 6 7 8
4
1.1.1 Phân hoạch đoạn left= 1, right= j=3 (left, j của 1.1)
Bước 1: Kiểm tra (left≥ right)?
Bước 2: x=a[(left+right)/2]=a[2]=4; i=left=1; j=right=3
Trang 441.1.1.1 Phân hoạch đoạn left= 1, right= j=2 (left, j của 1.1.1)
Bước 1: Kiểm tra (left≥ right)?
Bước 2: x=a[(left+right)/2]=a[1]=1; i=left=1; j=right=2
II KHỬ ĐỆ QUY (QUICK SORT)
1 Tổng quan về thuật toán Quick Sort
Trang 45E - Ví dụ: (tt)
1.1.1.2 Phân hoạch đoạn left= i= 3, right= 3 (i, right của 1.1.1)
Bước 1: Kiểm tra (left≥ right) => Dừng 1.1.2 Phân hoạch đoạn left= i= 4, right= 4 (i, right của 1.1)
Bước 1: Kiểm tra (left≥ right) => Dừng
Trang 46E - Ví dụ: (tt)
1.2 Phân hoạch đoạn left= i= 5, right= 8 (i, right của 1)
Bước 1: Kiểm tra (left≥ right)?
Bước 2: x=a[(left+right)/2]=a[6]=12; i=left=5; j=right=8
1
1 2 3 4 5 6 7 8
12
II KHỬ ĐỆ QUY (QUICK SORT)
1 Tổng quan về thuật toán Quick Sort
Trang 47E - Ví dụ: (tt)
1.2.1 Phân hoạch đoạn left= 5, right= j= 7 (left, j của 1.2)
Bước 1: Kiểm tra (left≥ right)?
Bước 2: x=a[(left+right)/2]=a[6]=12; i=left=5; j=right=8
1
1 2 3 4 5 6 7 8
10
Trang 48E - Ví dụ: (tt)
1.2.1.1 Phân hoạch đoạn left= 5, right= j= 6 (left, j của 1.2.1)
Bước 1: Kiểm tra (left≥ right)?
Bước 2: x=a[(left+right)/2]=a[5]=7; i=left=5; j=right=6
1
1 2 3 4 5 6 7 8
7
II KHỬ ĐỆ QUY (QUICK SORT)
1 Tổng quan về thuật toán Quick Sort
Trang 49 Hiệu quả thực hiện của giải thuật Quick Sort phụ thuộc vào việc chọn giá trị mốc.
được phần tử median làm mốc Khi đó dãy được phân chia thành 2 phần bằng nhau và cần lần phân hoạch thì sắp xếp thành công.
cực đại (hoặc cực tiểu) là mốc, dãy sẽ bị phân chia thành 2 phần không đều:
Trang 50Thuật toán Tốt nhất Trung bình Xấu nhất
Quick Sort O(nlog 2 (n)) O(nlog 2 (n)) O(n 2 )
Selection Sort O(n 2 ) O(n 2 ) O(n 2 )
Bubble Sort O(n 2 ) O(n 2 ) O(n 2 )
Insertion Sort O(n) O(n 2 ) O(n 2 )
So sánh độ phức tạp của thuật toán Quick Sort với một số
thuật toán sắp xếp phổ biến khác
II KHỬ ĐỆ QUY (QUICK SORT)
1 Tổng quan về thuật toán Quick Sort
F - Hiệu quả thuật toán Quick Sort (tt):
Trang 52Ý tưởng:
quy vào một ngăn xếp ẩn (implicit stack) để lần lượt lấy ra xử
lý Như vậy nếu gặp dữ liệu lớn sẽ dễ gây tràn stack.
hàm Quick Sort trong đệ quy ta thay bằng cách lưu lại các giá trị bên trái và bên phải của 2 dãy con vào 2 stack Sl và Sr, khi
nào cần sẽ gọi ra (chúng Sẽ được trình bày cụ thể ở một số thuật toán ta Sẽ được trình bày cụ thể ở một số thuật toán cũng Sẽ được trình bày cụ thể ở một số thuật toán có Sẽ được trình bày cụ thể ở một số thuật toán thể Sẽ được trình bày cụ thể ở một số thuật toán lưu Sẽ được trình bày cụ thể ở một số thuật toán chung Sẽ được trình bày cụ thể ở một số thuật toán các Sẽ được trình bày cụ thể ở một số thuật toán giá Sẽ được trình bày cụ thể ở một số thuật toán trị Sẽ được trình bày cụ thể ở một số thuật toán
bên Sẽ được trình bày cụ thể ở một số thuật toán trái Sẽ được trình bày cụ thể ở một số thuật toán và Sẽ được trình bày cụ thể ở một số thuật toán bên Sẽ được trình bày cụ thể ở một số thuật toán phải Sẽ được trình bày cụ thể ở một số thuật toán vào Sẽ được trình bày cụ thể ở một số thuật toán 1 Sẽ được trình bày cụ thể ở một số thuật toán Stack, Sẽ được trình bày cụ thể ở một số thuật toán khi Sẽ được trình bày cụ thể ở một số thuật toán lấy Sẽ được trình bày cụ thể ở một số thuật toán ra Sẽ được trình bày cụ thể ở một số thuật toán sẽ Sẽ được trình bày cụ thể ở một số thuật toán lấy Sẽ được trình bày cụ thể ở một số thuật toán 2 Sẽ được trình bày cụ thể ở một số thuật toán phần Sẽ được trình bày cụ thể ở một số thuật toán tử Sẽ được trình bày cụ thể ở một số thuật toán liên Sẽ được trình bày cụ thể ở một số thuật toán tiếp).
II KHỬ ĐỆ QUY (QUICK SORT)
2 Khử đệ quy thuật toán Quick Sort