Professional Documents
Culture Documents
Sorting Problem
Input: dãy ⟨ Ri (K i , datai ) , R j (K j , data j ) ,… , R N ( K N , data N ) ⟩ với K i , K j , … , K N có thứ tự bất kỳ.
Output: ⟨ R1 (K 1 , data), R2 ( K 2 , data) , … , R N (K N , data) ⟩ thỏa R1 . K 1 < R2 . K 2< …< R N . K N .
Sorting Problem là một trong những bài toán quan trọng trong lĩnh vực khoa học máy tính vì
nhiều ứng dụng1 sử dụng kết quả của bài toán này như một bước trung gian để giải quyết vấn
đề của ứng dụng đó. Ví dụ các công cụ tìm kiếm sách trong thư viện cần sắp xếp các kết quả trả
về theo thứ tự bảng chữ cái trước khi hiển thị với người dùng.
1
Các bạn đọc The Art of Computer Programming - Tập 3: Sorting and Searching.
Câu 3. SelectionSort, BubbleSort và InsertionSort: (100 phút)
1. Điền vào dấu “…” để hoàn thiện thuật toán SelectionSort, BubbleSort và InsertionSort.
Cho biết tên của từng thuật toán.
2. Minh họa từng bước từng thuật toán vừa viết trên dãy số sau: 5 , 2 , 4 , 6 , 3 ,1 và trả lời câu hỏi:
Selection sort:
5,2,4,6,3,1 – 1,2,4,6,3,5 – 1,2,4,6,3,5 – 1,2,3,4,6,5 – 1,2,3,4,6,5 – 1,2,3,4,5,6
Bubble sort:
5,2,4,6,3,1 – 2,5,4,6,3,1 – 2,4,5,6,3,1 – 2,4,5,6,3,1 – 2,4,5,3,6,1 – 2,4,5,3,1,6 – 2,4,5,3,1,6 –
2,4,5,3,1,6 – 2,4,3,5,1,6 – 2,4,3,1,5,6 – 2,4,3,1,5,6 – 2,3,4,1,5,6 – 2,3,1,4,5,6 – 2,3,1,4,5,6 –
2,3,1,4,5,6 – 2,3,1,4,5,6 – 2,1,3,4,5,6 - 2,1,3,4,5,6 - 2,1,3,4,5,6 - 2,1,3,4,5,6 – 1,2,3,4,5,6
Insertion sort:
5,2,4,6,3,1 – 2,5,4,6,3,1 – 2,4,5,6,3,1 – 2,4,5,6,3,1 – 2,3,4,5,6,1 – 1,2,3,4,5,6
3. Trường hợp xấu nhất, tốt nhất của mỗi thuật toán xảy ra khi nào? Giải thích?
Selection sort:
-TH xấu nhất : dãy ngược chiều mong muốn.(sort cả dãy )
-TH tốt nhất : dãy cùng chiều mong muốn. ( không cần phải sort )
Bubble sort:
-TH xấu nhất : dãy ngược chiều mong muốn.(sort cả dãy )
-TH tốt nhất : dãy cùng chiều mong muốn. ( không cần phải sort )
Insertion sort:
-TH xấu nhất : dãy ngược chiều mong muốn.(sort cả dãy )
-TH tốt nhất : dãy cùng chiều mong muốn. ( không cần phải sort )
4. Ứng với trường hợp xấu nhất của mỗi thuật toán, hãy:
a. Phân tích và xác định số lần so sánh các phần tử theo n .
Selection sort: O(n^2)
Bubble sort: O(n^2)
Insertion sort: O(n^2)
b. Phân tích và xác định số lần đổi chỗ các phần tử theo n .
Selection sort: O(1)
8. *Bạn hãy thử lý giải vì sao thuật toán có tên là SelectionSort? BubbleSort? InsertionSort?
Selection Sort : Dùng để đưa phần tử nhỏ nhất về đúng vị trí đầu tiên của dãy hiện hành.
Bubble Sort: so sánh 2 phần tử kề nhau, nếu chúng chưa đứng đúng thứ tự thì swap.Có thể
tiến hành từ trên xuống ( bên trái sang) hoặc từ dưới lên (bên phải sang)
Insertion Sort : giống như cách thức xếp quân bài , khi muốn sắp một bộ dài theo trật tự
người chơi bài rút lần lượt từ quân thứ 2, so với các quân đứng trước nó để chèn vào vị trí
thích hợp.
ANS:
5,13,2,25,7,17,20,8,4 – 5,25,2,13,7,17,20,8,4 – 5,25,20,13,7,17,2,8,4 –
25,5,20,13,7,17,2,8,4 – 4,5,20,13,7,17,2,8,25 (removed) – 4,5,20,13,7,17,2,8 –
4,13,20,8,7,17,2,5 – 20,13,4,8,7,17,2,5 – 5,13,4,8,7,17,2,20 –
5,13,4,8,7,17,2 – 5,13,17,8,7,4,2 – 17,13,5,8,7,4,2 – 2,13,5,8,7,4,17 –
2,13,5,8,7,4 - 13,2,5,8,7,4 – 13,8,5,2,7,4 - 4,8,5,2,7,13 – 4,8,5,2,7 – 8,4,5,2,7 –
8,7,5,2,4 – 4,7,5,2,8 – 4,7,5,2 – 7,4,5,2 – 2,4,5,7 - …
2,4,5,7,8,13,17,20,25
2. Nếu dãy A có n phần tử đã được xếp thứ tự tăng dần thì thời gian thực thi của HEAPSORT
như thế nào? Cùng câu hỏi này cho trường hợp dãy A có thứ tự giảm dần? thời gian thực thi
gần như nhau.
O(n log n)
3. Có phải big-O về thời gian thực thi trong trường hợp xấu nhất của HEAPSORT là nlg n hay
không? Giải thích? Biết rằng thủ tục MAX_HEAPIFY có chi phí về thời gian tỷ lệ với lgn.
Có,vì giả sử bạn đang sử dụng một đống tối đa được biểu thị dưới dạng một mảng và chèn các phần
tử tối đa của bạn ngược lại vào mảng đầu ra của bạn / vào mặt sau của mảng nếu bạn đang thực hiện
nó tại chỗ, đầu vào trường hợp xấu nhất cho heapSort là bất kỳ đầu vào nào buộc bạn "bong bóng
xuống" hoặc làm nóng lại mỗi khi bạn loại bỏ một phần tử. Điều này xảy ra mỗi khi bạn đang cố
gắng sắp xếp một tập hợp không có bản sao. Nó vẫn sẽ là Θ (n log n).Lý do trường hợp xấu nhất là
Θ (log n) cho một phần tử là vì chiều cao của cây sẽ là log n, và việc phải đi ngang qua toàn bộ
chiều cao là trường hợp xấu nhất, và do đó nó là log n. Chiều cao là log n vì chúng ta có một cây nhị
phân đầy đủ trong đó mọi cha mẹ đều có hai con, và do đó chiều cao của n nút trở thành log n.
Thuộc tính này ngụ ý rằng trường hợp tốt nhất của heapSort là khi tất cả các phần tử đều bằng nhau
(Θ (n), vì bạn không phải chuẩn hóa lại sau mỗi lần xóa, mất thời gian log (n) vì chiều cao tối đa
của heap là log (n )). Tuy nhiên, đây là một trường hợp tệ hại / không thực tế, đó là lý do tại sao
trường hợp thực sự tốt nhất cho heapsort là Θ (n log n).
Câu 6. MergeSort:
1. Một ứng dụng cần trộn hai dãy số B và C đã có thứ tự thành dãy số mới A vẫn có thứ tự. Ví
dụ dãy B={1, 4 , 7 , 8 ,9 }, C={2 , 3 , 5 ,6 } thì dãy A={1 , 2, 3 , 4 ,5 , 6 , 7 , 8 , 9} . Giả sử các giá trị
được lưu trong mảng một chiều.
a. Viết mã giả của thuật toán trộn cho bài toán trên.
b. Phân tích và xác định Big-Oh của thuật toán vừa viết.
Big Oh: nlog(n)
2. Kết hợp với thao tác trộn của câu trước, thuật toán MergeSort được viết như sau:
a. Thực thi từng bước thuật toán MergeSort trên dãy số sau: 21,7,84,19,22,78,6,30 .
Giả sử máy tính A thực hiện giải thuật InsertionSort. Máy tính B thực hiện giải thuật MergeSort
và một số tham số khác được biết như trong bảng sau:
Tốc độ xử lý Giải thuật Số lượng phần tử Ghi chú
Máy tính A 10 lệnh/giây Insertion Sort (2.n )
10 2
c1 = 2
n = 107
Máy tính B 107 lệnh/giây Merge Sort (50.n.lgn) c2 = 50
B: 35*10^8
c. Máy tính nào chạy nhanh hơn khi n tăng thêm? Giải thích?
Máy B chạy nhanh hơn. Vì nó có tốc độ xử lý theo số lượng phần tử nhanh hơn máy A.
d. *Bạn thử đoán xem tác giả có tâm ý gì khi soạn bài tập này? Kiểm tra kiến thức về Big O
notation,
Câu 9.
1. Trường hợp xấu nhất của QuickSort xảy ra khi nào?
Khi mà mảng array đã được sort rồi
2. Độ phức tạp tính toán của QuickSort trong trường hợp xấu nhất là bao nhiêu?
O(n^2 )
3. Phân tích và xác định Big-O của QuickSort trong trường hợp trung bình.
O(n logn)
4. *Bạn thử giải thích (theo ý kiến cá nhân của mình) tại sao thuật toán này có tên là
QuickSort? Gợi ý: quan sát độ phức tạp của QuickSort trong trường hợp tốt nhất, xấu nhất và
trung bình để thấy rằng nó có đặc điểm gì đặc biệt so với các thuật toán sắp xếp khác.
Có thể dùng nhanh cho mảng phụ hoặc ít phần tử. Thuật toán này mang tên QuickSort theo em
nghĩ là khi mình chọn 1 điểm then chốt (pivot) có thể chọn bất kỳ tại điểm nào trên mảng. Như
là chọn điểm đầu, điểm cuối, điểm giữa hoặc điểm bất kỳ.Quick sort trong mọi trường hợp đều
mang tính ổn định hơn so với các loại sort khác. Thường sẽ có độ phức tạp tương đương với
(nLogn).
Câu 10. Hãy điền vào bảng sau các ô còn trống:
Thời gian Ý tưởng
Thuật toán Tốt nhất Xấu nhất Trung bình Bộ nhớ chính của
(Best case) (Worst case) (Average case) thuật toán
Selection Sort Ω(n^2) O(n^2) θ(n^2) O(1) Tìm giá trị lớn
nhất hoặc nhỏ
nhất từ các
phần tử và
thay thế với
phần tử cuối
cùng của dãy
Dùng phương
pháp trao đổi
Bubble Sort Ω(n) O(n^2) θ(n^2) O(1)
liền kề
(exchange)
Dự trên so
Insertion Sort Ω(n) O(n^2) θ(n^2) O(1) sánh in-place
để sắp xếp
Dùng kỹ thuật
sắp xếp dựa
Ω(n log(n)) O(n log (n)) trên so sánh
Heap Sort θ(n log(n)) O(1)
dựa trên cấu
trúc dữ liệu
Binary Heap
Khi merge
nhiều phần tử
đã được sắp
xếp sẵn vào 1
dãy mà sap91
O(n log (n)) θ(n log(n))
Merge Sort Ω(n log(n)) O(n) xếp theo thứ
tự từ nhỏ đến
lớn, thì dãy
mới cũng
được sắp xếp
lại.
Sử dụng cách
Quick Sort Ω(n log(n)) O(n^2) Ω(n log(n)) O(n) thức chia để
trị
Câu 11. Bạn có biết?
1. Có một thuật toán sắp xếp tinh tế và độc đáo (chỉ ý kiến cá nhân) có tên là Radix Sort2.
Thuật toán sort xét về các digits từ 0 đến 9 của các hàng đơn vị, hàng chục và hàng nghìn và bỏ
từng cái vào cái xô để đựng (chắc cái này cũng tương tự như stack). Khi xét hàng đơn vị xong
rồi quăng ra các phần tử ra rồi xét hàng chục và tương tự.
2. Một ứng dụng về cách trực quan hóa các thuật toán sắp xếp, bạn có thể xem tại ĐÂY3.
3. Bài viết tổng quan khá đầy đủ về các thuật toán sắp xếp bạn có thể đọc tại ĐÂY4.
2
https://en.wikipedia.org/wiki/Radix_sort
3
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
4
https://en.wikipedia.org/wiki/Sorting_algorithm