Để sắp xếp 1 mảng bằng Sclcction Sort, liên tục chọn phần tử cực trị trong mắng rồi đưa nó về vị trí đầu cuối x của mảng chưa sắp xếp cho đến khi phần tử cực trị là phần tử cuối cùng của
Trang 1DAI HOC QUOC GIA THANH PHO HO CHi MINH
TRUONG DAI HOC KHOA HOC TU NHIEN
KHOA CONG NGHE THONG TIN
Trang 2DAI HOC QUOC GIA THANH PHO HO CHi MINH
TRUONG DAI HOC KHOA HOC TU NHIEN
KHOA CONG NGHE THONG TIN
BAO CAO THUC HANH
|Dé tail KHAO SAT VA PHAN TICH CAC THUAT TOAN SAP XEP
Giảng viên hướng dẫn: cô Phan Thị Phương Uyên
STT Họ và lên Mã số sinh viên
Trang 3Lời cảm ơn
Xin gửi lời cảm ơn sâu sắc đến thầy Văn Chí Nam và cô Phan Thị Phương Uyên đã truyền tai
những kiến thức vô cùng bổ ích cùng những lời khuyên chân thành Đây chính là những kiến thức quý bán dành cho chúng em trong suốt thời gian học tập qua
Nhờ những sự chia sẻ tận tình của thầy cô mà giờ đây bộ môn Cấu trúc đữ liệu à giải thuật ngày càng thú vị, sâu sắc hơn Qua đây, chúng em cũng nhận ra được tính ứng đụng và tầm quan trọng của bộ môn Cấu trúc đữ liệu uà giải thuật Hi vọng sắp tời chúng em lại càng được học hỏi
thêm nhiều kiến thức và kinh nghiệm của thầy cô
Trang 5VOL VttOng ee 10.2 Giải thích thuat todn 2 ee 10.3 Độ phỨc tạp ee ee
13 Kết quả chạy dữ liệu
13.1 Kiểu đữ liệu ngẫu nhiên Quy v2
14.3 Thông số máy tính và IDE đã dùng TQ eee ee
Trang 61 Giới thiệu
Sắp xếp là một quá trình tổ chức lại một dãy phần tử bất kì thành dãy có thứ tự Không chỉ mỗi ứng dụng trong lập trình, sắp xếp còn được ứng dụng rất nhiều trong đời sống Hiểu được độ quan trọng của sắp xếp, nhóm đã đi tìm hiểu và phân tích các loại thuật toán sắp xếp, từ đơn giản
đến phức tạp, để có cái nhìn cụ thể hơn, cũng như rút ra những nhận xét tổng quát về các nguyên
lí hoạt động, tính chất, tru, nhược điểm của các thuật toán sắp xếp này
Việc phân tích các thuật toán sắp xếp trên được dựa trên hai yếu tố: độ phức tạp thời gian và
độ phức tạp không gian Trong đó, nhóm sẽ chạy thử nghiệm các thuật toán sắp xếp để thấy được
độ phức tạp về mặt thời gian và số lượng phép so sánh đối với từng kiểu dữ liệu và từng kích cỡ khác nhau Từ đó đưa ra các nhận xét, kết luận đối với các thuật toán sắp xếp
Nhóm đã chọn set 2, đưa ra 11 thuật toán sắp xếp để giải quyết trong đồ án này, bao gồm:
Selection Sort, Insertion Sort, Bubble Sort, Shaker Sort, Shell Sort, Heap Sort, Merge Sort, Quick Sort, Counting Sort, Radix Sort, va Flash Sort.
Trang 72 Selection Sort
21 Ý tưởng
Selection Sort (thuật toán sắp xếp chọn) là thuật toán sắp xếp có thao tác chính là chọn Để sắp xếp 1 mảng bằng Sclcction Sort, liên tục chọn phần tử cực trị trong mắng rồi đưa nó về vị trí đầu (cuối) x của mảng chưa sắp xếp cho đến khi phần tử cực trị là phần tử cuối cùng của mảng Sau khi đưa phần tử đã chọn về đầu (cuối) mảng thì phần tử đầu (cuối) của mảng chưa sắp xếp là phần tử đứng sau (trước) phần tử đầu (cuối) ban đầu, vị trí: x+1 (x-1)
Nếu sắp xếp tăng dân:
+ Cách 1: Nếu chọn phần tử cực trị là min, đưa về đầu mảng
Trang 8Trường hợp sắp xếp tăng dần, cực trị (min) trong mắng n phần tử (chỉ số 0,1, ,n-l): Bước 1: Duyệt mảng từ vị trí đầu tiên (x) tới vị trí cuối cùng (n-1), tìm phần tử
min
+ Gan phan tit min JA phan tit dau tien (vi trí x) của mảng chưa sắp xếp
+ Nếu phần tử ở vị trí j có giá trị nhỏ hon min => min : phan tit vi tri j
[9J5]5]3|3]2]11017]| +]
† x=0
Bước 2: Chuyển phần tử cực trị về đầu mảng
+ Hoan vi phan tit min (j) vừa tìm được với phần tử đầu tiên (x) trong mảng chưa sắp xếp
[3J5]5]13]5]2]1]0ỊT7Ị2]
L0|5|5|2J5]2]119]7]4*|
+ Bỏ qua phần tử ở vị trí x, xét tiếp mảng từ phần tử phía sau nó: x=x+l
[0[5]5I5]5]2]1]19T17]#]
Trang 9Selection sort là thuật toán sắp xếp dựa trên phép so sánh, stable, in-place
Trang 103 Insertion Sort
3.1 Ý tưởng
Tnsertion Sort (thuật toán sắp xếp chèn) là thuật toán sắp xếp có thao tác chính là chèn, là
thuật toán được dùng nhiều trong đời sống thường ngày vì nó gần với cách suy nghĩ tự nhiên
Để có thể sắp xếp mảng có n phần tử bằng Insertion Sort theo thứ tự tăng dần, ta duyệt từng phần
tử (vị trí ¡), chuyển nó đến vị trí thích hợp: thỏa mãn giá trị phần tử ở vị trí x-l < giá trị phần tử
1 < giá trị phần tử x(0<z<?)
3.2 Giải thích thuật toán
Trường hợp sắp xếp tăng dần trong mắng n phần tử (chỉ số 0,1, ,n-1):
[91 5] 6] 3] 8] 2]
Bước 1: Xét phần tử
+ Xét phần tử đầu tiên
i=0 9|5]6]3]3]7)
+ Phần tử đầu tiên đã được sắp xếp (không có phần tử bên trái)
Bước 4: Xét các phần tử ở vị trí tiếp theo cho đến khi mảng đã sắp xếp xong Thực
hiện lặp lại các bước trên với phần tử đang xét là phần tử ở vị trí phía sau phần tử vừa xét (I=i+l})
i=2
Trang 11Độ phức tạp O(n) O(n?) O(n?)
Trường hợp tốt nhất khi mảng đã được sắp xếp sẵn
- Độ phức tạp không gian: O(1)
Trang 124 Bubble Sort
4.1 Ý tưởng
Bubble Sort (thuật toán sắp xếp bọt biển) là thuật toán sắp xếp, thao tác cơ bản là so sánh
và hoán vị
Để tạo ra 1 mảng được sắp xếp theo thứ tự tăng dần bằng phương pháp bubble Sort thi thực hiện
lặp lại thao tác so sánh 2 phần tử đứng cạnh nhau, và hoán vị nếu phần tử đứng trước lớn hơn
phần tử đứng sau cho đến khi tất cả phần tử đứng trước đều nhỏ hơn phần tử đứng sau nó (mảng được sắp xếp)
4.2 Giải thích thuật toán
Thao tác: Để sắp xếp 1 mảng theo thứ tự tăng dần có n phần tử bằng phương pháp Bubble
Sort
Bước 1: Duyệt dãy
+ Duyệt dãy từ phần tử vị trí ¡ (=0) đến phần tử cuối mắng chưa sắp xếp
Bước 2: So sánh, hoán vị
+ 8o sánh 2 phần tử đứng cạnh nhau trong dãy, nếu phần tử đứng trước lớn hơn phần tử đứng sau thì hoán vị 2 phần tử
1 3 6 5 2 4
Bước 3: Lặp lại bước 1, 2
Thực hiện lặp lại các bước trên với phần tử cuối đãy là phần tử
Lần 1: Độ lớn của mắng chưa duyệt n (n=6):
1 3 5 2 4 6 Lần 2: Độ lớn của mắng chưa duyệt n=n-l (n=B}
Trang 14Bubble sort là thuật toán sắp xếp dựa trên phép so sánh, stable, in-place
- Độ phức tạp thời gian:
Trường hợp Tốt nhất Trung bình Tệ nhất
- Độ phức tạp không gian: O(1)
Trang 155 Shaker Sort
5.1 Ý tưởng
Shaker Sort (thuật toán sắp xếp lắc) là 1 cải tiến của Bubble Sort
Để sắp xếp 1 mảng tăng đần bằng Bubble Sort,thực hiện nhiều lần đưa phần tử max trong mảng chưa sắp xếp về cuối mảng (duyệt theo 1 chiều), như vậy có nhiều thao tác so sánh không cần thiết
Để khắc phục điều này, Shaker Sort thực hiện việc đưa cả phần tử min về đầu mảng, max về cuối mắng trong I lần sắp xếp (duyệt theo 2 chiều), như vậy độ dài của mắng cần sắp xếp sẽ thu hẹp sau mỗi lần sắp xếp
5.2 Giải thích thuật toán
Để sắp xếp 1 mảng theo thứ tự tăng dần bằng Shaker Sort:
Trang 16Bước 3: Thực hiện lặp lại bước 2 cho đến khi vị trí duyệt bên trái lớn hơn vi trí duyệt
bên phải (mảng duyệt xong)
San mỗi lần thực hiện bước 2, vị trí duyệt bên trái qua phải 1 phần tử, vị trí duyệt bên phải qua
trái 1 phần tử ( độ lớn của mảng chưa sắp xếp, cần duyệt giảm dan)
Shaker sort là thuật toán sắp xếp dựa trên phép so sánh, stable, in-place
- Độ phức tạp thời gian:
Trường hợp Tốt nhất Trung bình Tệ nhất
Độ phức tạp O(n) O(n?) O(n?)
Trường hợp tốt nhất khi mảng đã được sắp xếp sẵn
- Độ phức tạp không gian: O(1)
Trang 176 Shell Sort
6.1 Ý tưởng
Shell Sort (thuật toán sắp xếp vỏ bọc) là 1 cải tiến dựa trên Insertion Sort để sắp xếp 1 mảng
có n phần tử
Để sắp xếp 1 mảng theo thứ tự tăng dần, trong Insertion Sort khi thực hiện thao tác đổi giá trị
giữa 2 phần tử cách xa nhan, phải đổi giá trị lần lượt các phần tử ở giữa 2 phần tử đó Để giảm
số lần đối giá trị trong Insertion Sort, Shell Sort đổi các phần tử cách nhau khoảng cách h ( nếu phần tử bên trái lớn hơn phần tử bên phải),lặp lại việc này cho đến khi khoảng cách h = 1
6.2 Giải thích thuật toán
Sắp xếp tăng dần mắng có n phần tử:(n=6)
Bước 1: Chia mảng cần sắp xếp thành các mảng con
+ Chia mắng thành các mắng con có các phần tử cách nhau 1 khoảng là h
lần chia thứ 1: h = n/2 (h = 6/2 = 3)
6 1 3 5 2 4
Bước 2: Sắp xếp trên các mảng con
+ S&p xếp các phần tử trong các lớp con
5 1 3 6 2 4
Bước 3: Giảm khoảng cách h, lặp lại bước 1,2:
Thực hiện lặp lại bước 1, bước 2 với khoảng cách h giảm dần cho đến khi h=l1 (không còn thao tác
đổi giá trị giữa 2 phần tử cách nhau >1), mảng sắp xếp xong
lần chia kế tiếp: h=h/2 (h=3/2=1)
5 1 3 6 2 4
Trang 18Shell sort là thuật toán sắp xếp dựa trên phép so sánh, in-place, nhưng không sta- ble
- Độ phức tạp thời gian:
Trường hợp Tốt nhất Trung bình Tệ nhất
4
Độ phức tap = O(nlog(n)) O(n3) O(n?)
Trường hợp tốt nhất xảy ra khi thuật toán đã được sắp xếp sẵn Trường hợp tệ nhất khi mỗi lần chọn khoảng cách h, các lớp con của nó đều cần phép hoán đổi nhiều nhất
- Độ phức tạp không gian: O(1)
Trang 197 Heap Sort
7.1 Ý tưởng
Heap Sort (thuật toán sắp xếp vun đống) là một thuật toán sắp xếp so sánh (comparison-
based) dựa trên cấu trúc dữ liệu Binary Heap Trong đó, Binary Hcap là một cây nhị phân
hoàn chỉnh (complcte binary trec) có cấu trúc đặc biệt: các nút cha (vị trí ?) có giá trị nhỏ hơn (Min heap) hoặc lớn hơn (Max heap) các nút con của nó (vị trí ¿2+ 1 vaix2+2) , do dé giá trị
ở đầu cây nhị phân là một phần tử cực trị
Về bản chất, Heap Sort là một biến thể của Selection Sort vì ý tưởng cơ bản của thuật toán là liên tục tim phần tử cực trị và đưa phần tử đó về cuối hoặc dau mang
Ví dụ: một cây nhị phân Max heap:
Cây nhị phân dạng mắng:
9 6 8 3 5 17 0 2 4 7.2 Giải thích thuật toán
1
Bước 1: Hiệu chỉnh mảng thành một Max heap bằng hàm Heapify
Ta sẽ sắp xếp lại mắng thành một Max heap bằng cách hoán vị sao cho các nút cha luôn có giá trị lớn hơn nút con
Với n là kích thước của mảng, ta bắt đầu từ nút cha có vị tri 5
vì tất cả các phần tử phía sau chắc chắn là các nút lá và không có mit con
— 1 ngược trở về phần tử đầu tiên
Trang 20Ta sẽ hoán vị nút cha với mrút con có giá trị lớn hơn trong hai nút con (nếu tồn tại) nếu mút con đó
có giá trị lớn hơn nút cha
Nếu mút con vừa bị hoán vị tiếp tục có các nút con (tức vị trí của nút con vừa bị hoán vị < 5 —1},
ta tiếp tục Heapify tại nút con đó
San khi Heapify tại phần tử đầu tiên của mắng, ta được một Max heap với phần tử đầu tiên là phần tử có giá trị lớn nhất
Bước 2: Chuyển các phần tử cực trị về cuối mảng
£ + +“ a a Ầ ” : ` +“ ae x ” ^ ^ 2 2 Ầ ”
Ta hoán vị nút đầu tiên (phần tử cực trị) và nút cuối cùng của cây nhị phân để đẩy phần tử cực
trị về cuối mắng
Trang 21mit dau tiên của cây nhị phân để tiếp tục tìm và đưa phần tử lớn nhất lên đầu cây nhị phân Sau
đó tiếp tục bước 2 để đẩy phần tử đó về cuối mảng
San khi mút còn lại duy nhất của cây nhị phân được xếp vào vị trí đầu tiên của mảng, ta đã sắp xếp xong
Độ phức tạp n"=logm nlogn nlogn
- Độ phức tạp không gian: O(1)
Trang 228 Merge Sort
8.1 Y tudng
Merge Sort (thuat toán sắp xếp trộn) là một thuật toán chia dé trị Thuật toán này chia mảng gốc thành 2 mảng con và tiếp tục thực hiện hành động chia đôi đó đối với các mảng con để chia các mảng con đó thành những mắng con nhỏ hơi cho tới đơn vị nhỏ nhất, tức mắng con có kích thước bằng 1 Sau đó thuật toán sẽ đần đần trộn các mắng con vừa mới được chia đó lại theo
Liên tục thực hiện thao tác trộn (Mecrge) cho đến khi toàn bộ các mảng con nhập được lại thành
mảng ban đầu với đữ liệu đã được sắp xếp
Trang 23Merge sort là thuật toán sắp xếp dựa trên phép so sánh, stable, in-place
- Độ phức tạp thời gian:
Trường hợp 'lốt nhất Trung bình Tệ nhất
Độ phức tạp (O(»lognm) - (O(nlogm) O(nlogn)
- Độ phức tạp không gian: O(n)
Trang 249 Quick Sort
9.1 Ý tưởng
Quick Sort (thuật toán sắp xếp nhanh) là một thuật toán chia dé trị Thuật toán này tìm
một phần tử chốt (pivot), xếp phần tử chốt này vào đúng vị trí của nó, sau đó xếp các phần tử còn lại qua 2 bên phần tử chốt sao cho các phần tử nhỏ hơn phần tử chốt nằm ở một bên và các phần tử lớn hơn phần tử chốt nằm ở một bên Sau đó ta thực hiếp tiếp các thao tác này trên 2 phần mảng mà ta mới chia cho đến khi mảng được sắp xếp theo đúng thứ tự
9.2 Giải thích thuật toán
Bước 1: Tìm phần tử chốt (pivot):
Ta chọn phần tử nằm ở chính giữa làm phần tử chết để chia đôi
Bước 2: Sắp xếp phần tử chốt và các phần tử còn lại bằng hàm Partition:
Ta sắp xếp phần tử chốt vào đúng vị trí, sau đó đi chuyển các phần tử nhỏ có giá trị nhỏ hơn giá trị của phần tử chốt sang bên trái phần tử chốt và các các phần tử có giá trị lớn hơn giá trị phần
tử chốt sang bên phải phần tử chốt
Ta sử dụng đệ quy để liên tục thực hiện lại từ bước 1 trên các phần mảng mới chia cho đến khi
toàn bộ đữ liệu của mảng được sắp xếp theo thức tự
Độ phức tạp (O(ølogn) O(nlogn) O(n?)
Trường hợp tệ nhất khi ta luôn chọn pivot là phần tử cực trị
- Độ phức tạp không gian: O(1)
Trang 25Ví dụ: Cho một dãy dit liéu input: 3, 1, 5, 3, 2, 1, 3,5
Ta có bảng tần suất như sau:
Khóa 1 2
Tans6 2 1
3 5 3.2
Sau đó bằng phương pháp ánh xạ số đếm ta sẽ tính toán được vị trí của các key, từ đó ta có thể đễ dàng xếp các key vào đúng vị trí của mình trong một mảng output mà không cần dùng đến phép so sánh
10.2 Giải thích thuật toán
Bước 1: Tìm giá trị lớn nhất của mảng để tạo mảng count (mảng đếm)
Bước 2: Đếm tần số của từng key vào mảng count
Ta kiểm tra từng phần tử trong mảng đầu vào Ở mỗi phần tử, với giá trị ¿, ta sẽ tăng giá trị Ở
phần tử thứ ¿ trong mắng đếm thêm 1, từ đó ta sẽ có mắng count chứa tần số của các giá trị trong mảng đầu vào
index 0 1 2 3 4 ð
count 0 2 1 3 0 2
Bước 3: Tính vị trí của các key
Với phương pháp ánh xạ số đếm, ta sẽ cộng đồn các phần tử trong mảng count để tính toán được
vị trí chính xác của các key Bắt đầu từ phần tử thứ 1 cho tới phần tử cuối cùng của mảng count,
ta liên tục cộng giá trị của phần tử hiện tại với phần tử ngay trước đó
index 0 1 2 3 4 5
count 0 2 3 6 6 8