1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo thực hành |Đề tài| khảo sát và phân tích các thuật toán sắp

51 0 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 51
Dung lượng 2,3 MB

Nội dung

Để 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 1

DAI HOC QUOC GIA THANH PHO HO CHi MINH

TRUONG DAI HOC KHOA HOC TU NHIEN

KHOA CONG NGHE THONG TIN

Trang 2

DAI 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 3

Lờ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 5

VOL 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 6

1 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 7

2 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 8

Trườ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 9

Selection sort là thuật toán sắp xếp dựa trên phép so sánh, stable, in-place

Trang 10

3 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 12

4 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 14

Bubble 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 15

5 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 16

Bướ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 17

6 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 18

Shell 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 19

7 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 20

Ta 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 21

mit 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 22

8 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 23

Merge 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 24

9 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 25

Ví 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

Ngày đăng: 11/12/2024, 10:19

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN