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

Tiểu luận cấu trúc dữ liệu và giải thuật Đề tài: Nghiên cứu và cài đặt chương trình thực hiện 6 giải thuật sắp xếp (Select_sort, Insert_sort, Bubble_sort, Merge_sort, Quick_sort Heap_sort) để sắp xếp dãy khóa theo chiều giảm dần

35 2,6K 17
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 35
Dung lượng 546,5 KB

Nội dung

Điều đó đòi hỏi phải thiết kế các giải thuật giải quyết mộtcách hiệu quả nhất vấn đề đặt ra Sắp xếp Sort là một quá trình biến đổi một danh sách các đối tượng thành mộtđối tượng thỏa mã

Trang 1

TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN VIỆN CÔNG NGHỆ THÔNG TIN KINH TẾ

Heap_sort) để sắp xếp dãy khóa theo chiều giảm dần

Giảng viên hướng dẫn : ThS Lưu Minh Tuấn

Lớp tín chỉ : Cấu trúc dữ liệu và giải thuật (215)_2 Nhóm thực hiện : Nhóm 8

HÀ NỘI, THÁNG 5/2016

DANH SÁCH CÁC THÀNH VIÊN TRONG NHÓM 8

1 Lê Duy Bách 11140444

2

Trần Thanh Sơn 11143814

Trang 2

3 Lê Bùi Tuấn Nghĩa 11143027

4 Nguyễn Tiến Công 11140588

5 Nguyễn Văn Toản 11146220

Trang 3

LỜI NÓI ĐẦU 5

Chương 1 : Giới thiệu và phát biểu đề tài 6

I Nêu vấn đề 6

II Phạm vi nghiên cứu của đề tài 6

III Mục tiêu 6

IV Phương pháp nghiên cứu 6

Chương 2: Trình bày nội dung về đề tài nghiên cứu 8

I Lý thuyết về các giải thuật sắp xếp 8

1 Khái niệm: 8

2 Một số thuật toán sắp xếp: 8

2.1 Sắp xếp chọn: 8

2.1.1 Định nghĩa: 8

2.1.2 Giải thuật: 8

2.2 Sắp xếp nổi bọt: 9

2.2.1 Định nghĩa: 9

2.2.2 Các phương pháp: 10

2.3 Sắp xếp trộn 11

2.3.1 Định nghĩa: 11

2.3.2 Các phương pháp: 11

2.4 Sắp xếp nhanh: 14

2.4.1 Định nghĩa: 14

2.4.2 Giải thuật: 14

2.5 Sắp xếp vun đống: 17

2.5.1 Định nghĩa: 17

2.5.2 Giải thuật: 17

2.6 Sắp xếp chèn: 19

2.6.1 Định nghĩa: 19

2.6.2 Giải thuật: (Dùng giả ngôn ngữ pascal) 19

II Cài đặt thử nghiệm chương trình 20

1 Sắp xếp lựa chọn(select_sort) 20

1.1 Chương trình 20

1.2 Chạy thử nghiệm 21

1.3 Đánh giá giải thuật select_sort 22

2 Sắp xếp kiểu “nổi bọt” (bubble_sort) 22

2.1 Chương trình: 22

2.2 Chạy thử nghiệm 23

2.3 Đánh giá giải thuật bubble_sort 23

3 Sắp xếp kiểu hòa nhập(Merge_sort) 24

3.1 Chương trình : 24

3.2 Chạy chương trình: 26

3.3 Đánh giá thuật toán merge_sort 26

4 Sắp xếp nhanh(Quick_sort) 27

4.1 Chương trình 27

Trang 4

4.3 Đánh giá giải thuật quick_sort 28

5 Sắp xếp vun đống (Heap_sort) 29

5.1 Chương trình 29

5.2 Chạy chương trình: 30

5.3 Đánh giá giải thuật heap_sort 32

6 Sắp xếp kiểu thêm dần(Insert_sort) 32

6.1 Chương trình 32

6.2 Chạy chương trình : 33

6.3 Đánh giá giải thuật insert_sort 33

Chương 3 : Đánh giá kết quả nghiên cứu và kết luận 34

I Đánh giá kết quả nghiên cứu 34

II Kết luận 34

TÀI LIỆU THAM KHẢO 36

Trang 5

LỜI NÓI ĐẦU

Trong kỉ nguyên Công Nghệ Thông Tin, cấu trúc dữ liệu là nền tảng trong mọi tổchức Cấu trúc dữ liệu được biểu diễn dưới nhiều khía cạnh Cấu trúc dữ liệu và Giảithuật là một môn học cơ sở trong chương trình đào tạo trang bị cho sinh viên nhữngkiến thức cơ bản về cấu trúc , dữ liệu khi thiết kế và cài đặt phần mềm

Trong các bước giải quyết một bài toán trên máy tính , công đoạn lập trình có vaitrò quan trọng nhất Việc ứng dụng tin học ngày càng phát triển , các yêu cầu thựctiễn ngày càng đa dạng Điều đó đòi hỏi phải thiết kế các giải thuật giải quyết mộtcách hiệu quả nhất vấn đề đặt ra

Sắp xếp (Sort) là một quá trình biến đổi một danh sách các đối tượng thành mộtđối tượng thỏa mãn một thứ tự xác định nào đó Sắp xếp đóng một vai trò rất quantrọng trong việc tìm kiếm dữ liệu Chẳng hạn, chúng ta thử hình dung xem một cuốn

từ điển nếu các từ không được sắp xếp theo thứ tự xác định mà người ta vẫn thườnglàm sẽ khó khăn thế nào trong việc ta tra cứu các từ Trong lĩnh vực kinh tế , việcsắp xếp lại càng quan trọng hơn Hiện nay đã có nhiều giải thuật tìm kiếm và sắpxếp được xây dựng, mức độ hiệu quả của từng giải thuật còn phụ thuộc vào tính chấtcủa cấu trúc dữ liệu cụ thể mà nó tá động đến mà ta lựa chọn phương pháp sắp xếpsao cho phù hợp Trong khoa học máy tính và trong toán học, một thuật toán sắpxếp là một thuật toán sắp xếp các phần tử của một danh sách (hoặc một mảng theothứ tự tăng dần hoặc giảm dần) Người ta thường xét trường hợp các phần tử cần sắpxếp là các con số Hầu hết bài toán đều có nhiều thuật toán khác nhau để giải quyếtchúng

Với sự bùng nổ của Công Nghệ Thông Tin đã xuất hiện nhiều ngôn ngữ lập trìnhnhư : Foxpro, Pascal, C/C++, C#, Oracle Trong đó ngôn ngữ lập trình cấp caoPascal là một ngôn ngữ có định kiểu mạnh mẽ, gần gũi với ngôn ngữ tự nhiên vàđược nhiều người biết đến Đó chính là lí do mà nhóm chúng em đã lựa chọn ngônngữ này để sử dụng cho bài toán sắp xếp

Để giải quyết một bài toán sắp xếp , ta có rất nhiều cách như : sắp xếp theo kiểulựa chọn (Simple selection sort), sắp xếp kiểu vun đống (Heap sort), sắp xếp nổi bọt(Bubble sort) , Thông qua ngôn ngữ lập trình Pascal nhóm chúng em sẽ đưa ra 6thuật toán sắp xếp cơ bản : Select_sort, Insert_sort, Bubble_sort, Merge_sort,Quick_sort, , Heap_sort

Trang 6

Chương 1 : Giới thiệu và phát biểu đề tài

I. Nêu vấn đề

Quá trình sắp xếp là quá trình bố trí lại các phần tử của một tập đối tượng điểnhình như một dãy số nào đó , một dãy chữ theo thứ tự của từ điển v.v., nhằm sắpxếp theo một thứ tự nhất định theo thứ tự tăng dân (hoặc giảm dần) đối với một dãy

số, thứ tự từ điển đối với một dãy chữ v.v.,

Bài toán sắp xếp thường được xuất hiện thường xuyên nhất trong các ứng dụng tinhọc như ngôn ngữ lập trình Pascal , với những yêu cầu , mục đích khác nhau thìsắp xếp dữ liệu lưu trữ trong máy tính theo cách và các bước khác nhau Nói chung,

dữ liệu có thể xuất hiện dưới nhiều dạng khác nhau và có thể lưu trữ một khối lượngđáng kể, nên việc xây dựng các giải thuật sắp xếp cho phép tìm kiếm nhanh sẽ có ý

nghĩa rất lớn Từ các vấn đề nêu trên giúp cho chúng em hiểu rõ mục đích để tài là :

Để sắp xếp các dãy số theo một trật tự, thứ tự tăng dần (hoặc giảm dần) tùy theo càoyêu cầu của người muốn sắp xếp, sắp xếp theo thứ tự để giúp cho việc tìm kiếm dễdàng hơn, qua đó có thể giúp chúng em hiểu rõ các ưu nhược điểm của phương phápsắp xếp để có thể so sánh tốc độ sắp xếp , từ đó có thể vận dụng các phương pháp đótrong việc sắp xếp theo yêu cầu của bài toán đặt ra một cách hiệu quả nhất và đócũng là mục đích mà nhóm em chọn đề tài về giải thuật sắp xếp để nghiên cứu

II. Phạm vi nghiên cứu của đề tài

Tìm hiểu và vận dung các lí thuyết cơ bản về 6 phương pháp sắp xếp là :

phương pháp chọn trực tiếp (Select_sort), chèn trực tiếp (Insert_sort), sắp xếp nổibọt (Bubble_sort), sắp xếp trộn (Merge_sort), sắp xếp kiểu vun đống (Heap_sort),sắp xếp nhanh (Quick_sort) , để cài đặt được chương trình, cho phép sắp xếp mộtdãy số đã cho tùy ý thành một dãy số có thứ tự theo các thuật toán sắp xếp nêu trên

III. Mục tiêu

 Mô tả quá trình thực hiện cả tất cả phương pháp sắp xếp

 Phân tích , đánh giá được độ phức tạp của từng giải thuật

 Chạy thành công chương trình cài đặt

IV. Phương pháp nghiên cứu

 Nêu ý tưởng của thuật toán

 Tìm hiểu giải thuật

 Vẽ sơ đồ khối

 Mô phỏng thuật toán

 Phân tích , đánh giá độ phức tạp của thuật toán

 Chạy file cài đặt

Trang 7

Chương 2: Trình bày nội dung về đề tài nghiên cứu

Trang 8

I Lý thuyết về các giải thuật sắp xếp

1 Khái niệm:

Trong khoa học máy tính và trong toán học, thuật toán sắp xếp là

một thuật toán sắp xếp các phần tử của một danh sách (hoặc một mảng) theothứ tự (tăng hoặc giảm) Người ta thường xét trường hợp các phần tử cần sắpxếp là các số

Bài toán sắp xếp đã được nhiều nhà khoa học quan tâm

2 Một số thuật toán sắp xếp:

2.1 Sắp xếp chọn:

2.1.1 Định nghĩa:

Sắp xếp chọn (select sort) là phương pháp sắp xếp bằng cách chọn phần

tử lớn nhất xếp vào vị trí thứ nhất, tương tự với các phần tử lớn thứ hai, thứba,

2.1.2 Giải thuật:

a Ý tưởng:

Chọn phần tử lớn nhất trong n phần tử ban đầu, đưa phần tử này về vị tríđúng là đầu tiên của dãy hiện hành Sau đó không quan tâm đến nó nữa,xem dãy hiện hành chỉ còn n-1 phần tử của dãy ban đầu, bắt đầu từ vị tríthứ 2 Lặp lại quá trình trên cho dãy hiện hành đến khi dãy hiện hành chỉcòn một phần tử Dãy ban đầu có n phần tử, vậy tóm tắt ý tưởng thuậttoán là thực hiện n-1 lượt việc đưa phần tử lớn nhất trong dãy hiện hành

2 For i:= i + 1 to n do {tìm khóa lớn nhất của dãy còn lại}

if k[m] < k[j] then m:= j;

if m <> i then {đổi chỗ}

begin x:= k[i]; {khóa đầu dãy}

k[i] := k[m];

k[m]:= x;

end;

end;

Trang 9

3 Return;

c Đánh giá:

o Thuật toán ít phải đổi chỗ các phần tử nhất trong số các thuật toánsắp xếp(n lần hoán vị) nhưng có độ phức tạp so sánh là O(n2) (n2/2phép so sánh)

o Thuật toán tốn thời gian gần như bằng nhau đối với mảng đã đượcsắp xếp cũng như mảng chưa được sắp xếp

2.2 Sắp xếp nổi bọt:

2.2.1 Định nghĩa:

Sắp xếp nổi bọt (bubble sort) là phương pháp sắp xếp đơn giản, dễ hiểu

thường được dạy trong khoa học máy tính Giải thuật bắt đầu từ đầu của tập dữliệu Nó so sánh hai phần tử đầu, nếu phần tử đứng trước nhỏ hơn phần tửđứng sau thì đổi chỗ chúng cho nhau Tiếp tục làm như vậy với cặp phần tửtiếp theo cho đến cuối tập hợp dữ liệu Sau đó nó quay lại với hai phần tử đầucho đến khi không còn cần phải đổi chỗ nữa

2.2.2 Các phương pháp:

a Sắp xếp từ trên xuống:

Giả sử dãy cần sắp xếp có n phần tử Khi tiến hành từ trên xuống, ta so sánh

hai phần tử đầu, nếu phần tử đứng trước nhỏ hơn phần tử đứng sau thì đổi chỗchúng cho nhau Tiếp tục làm như vậy với cặp phần tử thứ hai và thứ ba vàtiếp tục cho đến cuối tập hợp dữ liệu, nghĩa là so sánh (và đổi chỗ nếu cần)

phần tử thứ n-1 với phần tử thứ n Sau bước này phần tử cuối cùng chính là

phần tử nhỏ nhất của dãy

Sau đó, quay lại so sánh (và đổi chố nếu cần) hai phần tử đầu cho đến

khi gặp phần tử thứ n-2

Ghi chú: Nếu trong một lần duyệt, không phải đổi chỗ bất cứ cặp phần

tử nào thì danh sách đã được sắp xếp xong

b Sắp xếp từ dưới lên:

Sắp xếp từ dưới lên so sánh (và đổi chỗ nếu cần) bắt đầu từ việc so sánh

cặp phần tử thứ n-1 và n Tiếp theo là so sánh cặp phần tử thứ n-2 và n-1,

cho đến khi so sánh và đổi chỗ cặp phần tử thứ nhất và thứ hai Sau bước này

phần tử lớn nhất đã được nổi lên vị trí trên cùng (nó giống như hình ảnh của

Trang 10

các "bọt" khí nhẹ hơn được nổi lên trên) Tiếp theo tiến hành với các phần tử

If k[j] > k[j - 1] then Begin

Trong khoa học máy tính, sắp xếp trộn (merge sort) là một thuật toán sắp

xếp để sắp xếp các danh sách (hoặc bất kỳ cấu trúc dữ liệu nào có thể truy cậptuần tự, v.d luồng tập tin) theo một trật tự nào đó Nó được xếp vào thểloại sắp xếp so sánh Thuật toán này là một ví dụ tương đối điển hình của lốithuật toán chia để trị do John von Neumann đưa ra lần đầu năm 1945 Mộtthuật toán chi tiết được Goldstine và Neumann đưa ra năm 1948

2.3.2 Các phương pháp:

Giả sử có hai danh sách đã được sắp xếp a[1 m] và b[1 n] Ta có thể

trộn chúng lại thành một danh sách mới c[1 m+n] được sắp xếp theo cách sau:

Trang 11

 So sánh hai phần tử đứng đầu của hai danh sách, lấy phần tử lớn hơncho vào danh sách mới Tiếp tục như vậy cho tới khi một trong haidanh sách là rỗng.

 Khi một trong hai danh sách là rỗng ta lấy phần còn lại của danh sáchkia cho vào cuối danh sách mới

a Trộn tại chỗ:

Giả sử trong danh sách a[1 n] có 2 danh sách con kềnhau a[k 1 k 2 ]a[k 2 1+k 3 ] đã được sắp Ta áp dụng cách trộn tương tự nhưtrên để trộn hai danh sách con vào một danh sách tạm T[k1 k 3 ] rồi trả lại cácgiá trị của danh sách tạm T về danh sách A Làm như vậy gọi là trộn tại chỗ

b Trộn từ dưới lên:

Nếu danh sách con chỉ gồm hai phần tử, mỗi nửa của nó gồm một phần tửđương nhiên đã được sắp Do đó việc trộn tại chố hai nửa danh sách này chodanh sách con 2 phân tử được sắp

Xuất phát từ đầu danh sách a ta trộn a[1] với a[2], a[3] với a[4], Khi đó

mọi danh sách con gồm hai phần tử của a đã được sắp Tiếp tục trộn các danhsách con kế tiếp nhau gồm 2 phần tử thành các danh sách con 4 phần tử Mỗilần trộn số các danh sách con cần trộn giảm đi một nửa Quá trình dừng lại khi

số danh sách con chỉ còn một

c Sắp xếp trộn đệ quy:

Một cách gọi đệ quy của sắp xếp trộn cũng thường được hướng dẫn trongcác giáo trình giải thuật

Để sắp xếp trộn đoạn a[k 1 k 2 ] của danh sách a[1 n] ta chia đoạn đó thành

2 phần a[k 1 k 3 ] và a[k 3 1+k 2 ], trong đó

k 3 = tiến hành sắp xếp với mỗi phần rồi trộn chúng lại Lời gọi thủ tục sắp xếp

trộn với a[1 n] sẽ cho kết quả là sắp toàn bộ danh sách a[1 n]

d Trộn các đường tự nhiên:

Như trong phần đánh giá giải thuật, một trong những nhược điểm lớn củathuật toán Trộn trực tiếp là không tận dụng những thông tin về đặc tính củadãy cần sắp xếp Ví dụ trường hợp dãy đã có thứ tự sẵn Chính vì vậy, trongthực tế người ta ít dùng thuật toán trộn trực tiếp mà người ta dùng phiên bảncải tiến của nó Phiên bản này thường được biết với tên gọi thuật toán trộn tựnhiên (Natural Merge sort)

e Khái niệm đường chạy:

Ðể khảo sát thuật toán trộn tự nhiên, trước tiên ta cần định nghĩa khái niệmđường chạy (run):

Một đường chạy của dãy số a là một dãy con không giảm của cực đại

của a Nghĩa là, đường chạy r = (a i , a i+1 , , a j ) phải thỏa điều kiện:

0 ≤ i ≤ j < n, với n là số phần tử của dãy a

a k ≤ a k+1k, i ≤ k ≤ j

Ví dụ dãy 12, 2, 8, 5, 1, 6, 4, 15 có thể coi như gồm 5 đường chạy (12);(2, 8); (5); (1, 6); (4, 15)

Trang 12

2.{Hòa nhập 2 dãy con chưa hết}

while ((i <= k2) and (j <= k3)) do begin

if a[i] >= a[j] then begin

b[k]:= a[i];

i:= i + 1;

end else begin b[k]:= a[j];

a[i]:= b[k];

Trang 13

Thuật toán trộn tự nhiên khác thuật toán trộn trực tiếp ở chỗ thay vì luôn

cứng nhắc phân hoạch theo dãy con có chiều dài k, việc phân hoạch sẽ

theo đơn vị là đường chạy ta chỉ cần biết số đường chạy của a sau lần

phân hoạch cuối cùng là có thể biết thời điểm dừng của thuật toán vì dãy

đã có thứ tự là dãy chi có một đường chạy

Một nhược điểm lớn nữa của thuật toán trộn là khi cài đặt thuật toán đòi

hỏi thêm không gian bộ nhớ để lưu các dãy phụ b, c Hạn chế này khó

chấp nhận trong thực tế vì các dãy cần sắp xếp thường có kích thước lớn

Vì vậy thuật toán trộn thường được dùng để sắp xếp các cấu trúc dữ liệu

khác phù hợp hơn như danh sách liên kết hoặc file

2.4 Sắp xếp nhanh:

2.4.1 Định nghĩa:

Sắp xếp nhanh (Quicksort), còn được gọi là sắp xếp kiểu phân chia (part

sort) là một thuật toán sắp xếp phát triển bởi C.A.R Hoarec sắp thành hai danh

sách con Khác với sắp xếp trộn, chia danh sách cần sắp xếp a[1 n] thành hai

danh sách con có kích thước tương đối bằng nhau nhờ chỉ số đứng giữa danh

sách, sắp xếp nhanh chia nó thành hai danh sách bằng cách so sánh từng phần

tử của danh sách với một phần tử được chọn được gọi là phần tử chốt Những

phần tử lớn hơn hoặc bằng phần tử chốt được đưa về phía trước và nằm trong

danh sách con thứ nhất, các phần tử nhỏ hơn chốt được đưa về phía sau và

Trang 14

thuộc danh sách đứng sau Cứ tiếp tục chia như vậy tới khi các danh sách conđều có độ dài bằng 1.

2.4.2 Giải thuật:

a Ý tưởng (sắp xếp theo thứ tự giảm):

- Chọn một khóa làm khóa chốt (thường là khóa đầu dãy) Mọi khóa lớn hơnchốt phải được nằm ở trước chốt Muốn vậy các khóa ki, kj trong dãy phải được

so sánh để đổi chỗ cho nhau hoặc đổi chỗ cho chốt nếu nó lớn hơn chốt mà lạinằm ở sau chốt, nếu nhỏ hơn chốt mà nằm ở trước chốt Khi việc đổi chỗ đượckhoàn thành thì dãy khóa được chia thành 2 phân đoạn:

+ Phân đoạn lớn hơn chốt thì ở trước chốt

+ Phân đoạn nhỏ hơn chốt thì nằm ở sau chốt

- Còn khóa chốt nằm ở giữa hai phân đoạn và đó cũng là vị trí của khóa chốtsau sắp xếp Với mỗi phân đoạn con, một kỹ thuật tương tự lại được áp dụngcho đến khi dãy được sắp xếp hoàn toàn

b Quick sort đệ quy sử dụng cấu trúc dữ liệu.

c Khử đệ quy:

Nhiều người cho rằng việc khử đệ quy của sắp xếp nhanh thực ra khôngcần thiết, nó chỉ có tác dụng cho những người mới tiếp cận khoa học máy tínhhiểu sâu sắc hơn về khái niệm đệ quy Bản chất của các giải thuật đệ quy làlưu trữ các tham biến đệ quy vào một ngăn xếp (stack) để lần lượt lấy ra xử lý.

Khi khử đệ quy của giải thuật đệ quy, mỗi lần phân chia danh sách thành 2danh sách con ta lưu trữ các tham số của danh sách đứng sau vào một ngănxếp, rồi phân chia tiếp danh sách đứng trước

d Giải thuật:

Procedure QUICK_SORT(k,cs_duoi,cs_tren);

{Giải thuật thực hiện sắp xếp dãy khóa k gồm n phần tử theo chiều giảm Trong giảithuật, sử dụng một bản ghi giả có khóa tương ứng là chỉ số dưới và chỉ số trên (ban đầucs_duoi = 1, cs_tren = n) Ta sử dụng 2 biến chỉ số i và j để chọn khóa trong quá trình

xử lý Biến chot được dùng để chứa giá trị của “khóa chốt” Biến phandoan là biến

logic dùng để đánh dấu dãy khóa được phân làm hai phân đoạn (bảng khóa) con hay

không (phandoan = false thì dãy khóa được phân làm hai phân đoạn con)}

Trang 15

i:= cs_duoi;

j:= cs_tren +1;

While phandoan do

Begin

i:= i + 1; {tăng i lên 1}

While k[i] > chot do i:= i + 1;

j:=j - 1;

While k[j] < chot do j:= j - 1;

{so sánh i với j}

If i < j then Begin x:= k[i];

{sắp xếp phân đoạn con của khóa chốt}

Call QUICK_SORT(k,j + 1,cs_tren);

End;

3 Return;

e Đánh giá:

Thời gian thực hiện:

o Trung bình: O(n log n)

Trang 16

o Xấu nhất: O(n2)

2.5 Sắp xếp vun đống:

2.5.1 Định nghĩa:

Sắp xếp vun đống (Heapsort) dựa trên một cấu trúc dữ liệu được gọi

là đống nhị phân (binary heap), gọi đơn giản là đống Trong mục này chỉ

nói về đống trong bài toán sắp xếp

Đống (heap):

Mỗi mảng a[1 n] có thể xem như một cây nhị phân gần đầy (có trọng số

là các giá trị của mảng), với gốc ở phần tử thứ nhất, con bên trái của

đỉnh a[i] là a[2*i] con bên phải là a[2*i+1] (nếu mảng bắt đầu từ 1 còn nếu mảng bắt đầu từ 0 thì 2 con là a[2*i+1] và a[2*i+2]) (nếu 2*i<=n hoặc 2*i+1<=n, khi đó các phần tử có chỉ số lớn hơn không có

con, do đó là lá)

 Một cây nhị phân, được gọi là đống cực đại nếu khóa của mọi nút không

nhỏ hơn khóa các con của nó Khi biểu diễn một mảng a[] bởi một cây nhi phân theo thứ tự tự nhiên điều đó nghĩa là a[i]>=a[2*i]

và a[i]>=a[2*i+1] với mọi i =1 int(n/2) Ta cũng sẽ gọi mảng như vậy là đống Như vậy trong đống a[1] (ứng với gốc của cây) là phần tử lớn nhất.

Mảng bất kỳ chỉ có một phần tử luôn luôn là một đống

 Một đống cực tiểu được định nghĩa theo các bất đẳng thức ngược

lại: a[i]<=a[2*i] và a[i]<=a[2*i+1] Phần tử đứng ở gốc cây cực tiểu là

- Gồm 2 giai đoạn:

+ Giai đoạn 1:

 Tạo đống ban đầu

 Dựng cây nhị phân hoàn chỉnh theo nguyên tắc gốc là khóa đầu dãy, cáckhóa trong dãy được xét lần lượt từ trái sang phải để bổ sung dần theo

Trang 17

nguyên tắc từ trên xuống, từ trái sang phải, hết mức này đến mức khác.

 Vun đống ban đầu: theo nguyên tắc từ dưới lên, từ trái sang phải, mứcnày đến mức khác Ta chỉ cần vun đống cho các cây con có chỉ số gốc

từ , và ta chỉ vun đống cho cây có nút cha là j mà hai cây con đã là đống

 Ta được đống ban đầu và khóa lớn nhất nằm ở gốc cây được gọi là

“khóa trội”.

+ Giai đoạn 2: Ở mỗi lượt gồm 2 bước:

Đổi chỗ “khóa trội” cho khóa đang ở vị trí xét (từ dưới lên trên, từ phải sang trái, hết mức này đến mức khác) và “khóa trội” được loại ra khỏi

Ngày đăng: 05/05/2016, 00:34

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[5] Website: https://vi.wikipedia.org [6] Website: 123doc.vn Link
[1] Lưu Minh Tuấn. Bài giảng cấu trúc dữ liệu &amp; GT. Bộ môn CNTT-ĐHKTQD năm 2004 Khác
[2] Đỗ Xuân Lôi. Cấu trúc dữ liệu và giải thuật. ĐHBKHN, NXB Thống kê, năm 1999 Khác
[3] Leendert Ammeraal. Programs and Data Structures and Algorithms. A.Wesly, 1983 Khác
[4] A.V.Aho, JE.Hoperoft, J.D.Ulmann. Data Structures and Algorithms. A.Wesley, 1983 Khác

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w