1. Trang chủ
  2. » Công Nghệ Thông Tin

Đề tài : TÌM HIỂU THUẬT TOÁN SẮP XẾP HEAP SORT VÀ ỨNG DỤNG GIẢI BÀI TOÁN NGƯỜI BÁN HÀNG

37 1,2K 14

Đ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 37
Dung lượng 700 KB

Nội dung

Khái niệm bài toán sắp xếp 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 nào đó theomột thứ tự nhất định.. Chẳng hạn như thứ tự tăng dần hay giảm dần đối vớimột dãy

Trang 1

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN& TRUYỀN THÔNG

KHOA CÔNG NGHỆ THÔNG TIN

-o0o -BÁO CÁO THỰC TẬP CƠ SỞ

Đề tài :

TÌM HIỂU THUẬT TOÁN SẮP XẾP HEAP SORT VÀ ỨNG DỤNG

GIẢI BÀI TOÁN NGƯỜI BÁN HÀNG

Giáo viên hướng dẫn : Đặng Thị Oanh Sinh viên thực hiện : Nguyễn Hữu Thi Lớp : CNTT_K12D

Thái Nguyên, tháng 04 năm 2016

Trang 2

MỤC LỤC

LỜI NÓI ĐẦU 5

CHƯƠNG 1 KIẾN THỨC CƠ SỞ 6

1.1 BÀI TOÁN SẮP XẾP 6

1.1.1 Khái niệm bài toán sắp xếp 6

1.1.2 Nội dung, ví dụ phân tích về bài toán sắp xếp 6

1.2 TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH C 10

1.2.1 Sự phát triển của ngôn ngữ lập trình C 10

1.2.2 Cấu trúc chương trình C 12

1.2.3 Các kiểu dữ liệu và khai báo biến 14

CHƯƠNG 2 THUẬT TOÁN HEAP SORT 17

2.1 Ý TƯỞNG 17

2.2 NỘI DUNG 18

2.2.1 Các tính chất của Heap 18

2.2.2 Giải thuật Heap Sort 19

2.2.3 Ðánh giá giải thuật 19

2.3 THỦ TỤC HEAP SORT 19

2.4 VÍ DỤ 19

2.5 LƯU ĐỒ THUẬT TOÁN 22

2.6 ĐỘ PHỨC TẠP CỦA THUẬT TOÁN 24

CHƯƠNG 3 ỨNG DỤNG VÀ CHƯƠNG TRÌNH 25

3.1 BÀI TOÁN NGƯỜI BÁN HÀNG 25

3.1.1 Bài toán 25

3.1.2 Phân tích 25

3.1.3 Độ phức tạp của thuật toán 27

3.1.4 Cài đặt thuật toán 27

3.2 CÀI ĐẶT CHƯƠNG TRÌNH 32

3.2.1 Công cụ lập trình 32

3.2.2 Kết quả thực hiện 33

KẾT LUẬN 36

TÀI LIỆU THAM KHẢO 37

Trang 3

LỜI CẢM ƠN

Để có thể hoàn tất được bài thực tập này, em xin gửi lời cảm ơn sâu sắcnhất đến quý Thầy Cô Khoa Công nghệ thông tin, Trường Đại học Công NghệThông Tin và Truyền Thông Thái Nguyên, với tri thức và tâm huyết của mình

đã truyền đạt vốn kiến thức quý báu cho chúng em trong suốt thời gian học tậptại trường

Em xin chân thành cảm ơn TS Đặng Thị Oanh đã tận tâm giúp đỡ vàhướng dẫn em trong suốt quá trình thực hiện đề tài này Nếu không có sự hướngdẫn, chỉ bảo của cô thì em khó có thể hoàn thiện được

Em cũng xin chân thành cảm ơn đến bạn bè đã giúp đỡ, trao đổi hoànthiện bài thực tập cơ sở này

Thái Nguyên, ngày 29 tháng 04 năm 2016

Sinh viên

Nguyễn Hữu Thi

Trang 4

LỜI NÓI ĐẦU

Hiện nay công nghệ thông tin ngày càng phát triển và được ứng dụng rộngrãi trong tất cả các lĩnh vực của cuộc sống Trong hầu hết các hệ lưu trữ, quản

lý dữ liệu, thao tác tìm kiếm thường được thực hiện nhiều nhất để khai thácthông tin một cách nhanh chóng

Muốn việc tìm kiếm nhanh chóng thì dữ liệu cần phải được sắp xếp sẵn,ngăn nắp theo một trật tự, hệ thống nhất định sẽ cho phép chúng ta tìm kiếmnhanh Việc tìm kiếm, sắp xếp có ý nghĩa rất lớn trong việc quản lý và lưu trữ.Nội dung mà em muốn trình bày dưới đây là một trong số những thuật toánsắp xếp thông dụng nhất và đó cũng là nội dung mà cô Đặng Thị Oanh đã giúp

đỡ và hướng dẫn em nghiên cứu về đề tài “Tìm hiểu thuật toán sắp xếp kiểu vun đống (Heap Sort) và ứng dụng giải bài toán người giao hàng”.

Mục tiêu và nhiệm vụ

- Mô tả về thuật toán sắp xếp kiểu vun đống (Heap Sort)

- Hướng đến các kỹ thuật lập trình với ngôn ngữ lập trình C

- Áp dụng kết quả nghiên cứu để tạo một DEMO mô phỏng thuật toán sắpxếp qua bài toán người giao hàng

Em rất mong nhận được sự thông cảm và đóng góp của các Thầy, Cô để lầnsau làm bài được tốt hơn

Em xin trân thành cảm ơn !

Thái Nguyên, ngày 29 tháng 04 năm 2016

Trang 5

CHƯƠNG 1 KIẾN THỨC CƠ SỞ

1.1 BÀI TOÁN SẮP XẾP

1.1.1 Khái niệm bài toán sắp xếp

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 nào đó theomột thứ tự nhất định Chẳng hạn như thứ tự tăng dần (hay giảm dần) đối vớimột dãy số, thứ tự từ điển đối với các từ v.v… Yêu cầu về sắp xếp thườngxuyên xuất hiện trong các ứng dụng Tin học với các mục đích khác nhau: sắpxếp dữ liệu trong máy tính để tìm kiếm cho thuận lợi, sắp xếp các kết quả xử lý

để in ra trên bảng biểu v.v…

1.1.2 Nội dung, ví dụ phân tích về bài toán sắp xếp

Dữ liệu có thể xuất hiện dưới nhiều dạng khác nhau, nhưng ở đây ta quyước: Một tập các đối tượng cần sắp xếp là tập các bản ghi (records), mỗi bảnghi bao gồm một số trường (fields) khác nhau Nhưng không phải toàn bộ cáctrường dữ liệu trong bản ghi đều được xem xét đến trong quá trình sắp xếp màchỉ là một trường nào đó (hay một vài trường nào đó) được chú ý tới thôi.Trường như vậy ta gọi là khoá (key) Sắp xếp sẽ được tiến hành dựa vào giá trịcủa khoá này

Ví dụ: Hồ sơ tuyển sinh của một trường Đại học là một danh sách thí sinh,mỗi thí sinh có tên, số báo danh, điểm thi Khi muốn liệt kê danh sách nhữngthí sinh trúng tuyển tức là phải sắp xếp các thí sinh theo thứ tự từ điểm cao nhấttới điểm thấp nhất Ở đây khoá sắp xếp chính là điểm thi

Trang 6

Khi sắp xếp, các bản ghi trong bảng sẽ được đặt lại vào các vị trí sao cho giátrị khoá tương ứng với chúng có đúng thứ tự đã ấn định Vì kích thước của toànbản ghi có thể rất lớn, nên nếu việc sắp xếp thực hiện trực tiếp trên các bản ghi

sẽ đòi hỏi sự chuyển đổi vị trí của các bản ghi, kéo theo việc thường xuyên phải

di chuyển, copy những vùng nhớ lớn, gây ra những tổn phí thời gian khá nhiều Thường người ta khắc phục tình trạng này bằng cách xây dựng một bảngkhoá: Mỗi bản ghi trong bảng ban đầu sẽ tương ứng với một bản ghi trong bảngkhoá Bảng khoá cũng gồm các bản ghi nhưng mỗi bản ghi chỉ gồm có haitrường

Trường thứ nhất chứa khoá

Trường thứ hai chứa liên kết tới một bản ghi trong bảng ban đầu, tức là chứathông tin đủ để biết bản ghi tương ứng với nó trong bảng ban đầu là bản ghi nào Sau đó, việc sắp xếp được thực hiện trực tiếp trên bảng khoá, trong quátrình sắp xếp, bảng chính không hề bị ảnh hưởng gì, việc truy cập vào một bảnghi nào đó của bảng chính vẫn có thể thực hiện được bằng cách dựa vào trườngliên kết của bản ghi tương ứng thuộc bảng khoá Như ở ví dụ trên, ta có thể xâydựng bảng khoá gồm 2 trường, trường khoá chứa điểm và trường liên kết chứa

số thứ tự của người có điểm tương ứng trong bảng ban đầu:

Trang 7

Có thể còn cải tiến tốt hơn dựa vào nhận xét sau: Trong bảng khoá, nội dungcủa trường khoá hoàn toàn có thể suy ra được từ trường liên kết bằng cách: Dựavào trường liên kết, tìm tới bản ghi tương ứng trong bảng chính rồi truy xuấttrường khoá trong bảng chính Như ví dụ trên thì người mang số thứ tự 1 chắcchắn sẽ phải có điểm thi là 20, còn người mang số thứ tự 3 thì chắc chắn phải cóđiểm thi là 18 Vậy thì bảng khoá có thể loại bỏ đi trường khoá mà chỉ giữ lạitrường liên kết Trong trường hợp các phần tử trong bảng ban đầu được đánh số

từ 1 tới n và trường liên kết chính là số thứ tự của bản ghi trong bảng ban đầunhư ở ví dụ trên, người ta gọi kỹ thuật này là kỹ thuật sắp xếp bằng chỉ số: Bảngban đầu không hề bị ảnh hưởng gì cả, việc sắp xếp chỉ đơn thuần là đánh lại chỉ

số cho các bản ghi theo thứ tự sắp xếp

Cụ thể hơn:

Nếu r[1 n] là các bản ghi cần sắp xếp theo một thứ tự nhất định thì việc sắpxếp bằng chỉ số tức là xây dựng một dãy Index[1 n] mà ở đây:

Index[j] = Chỉ số của bản ghi sẽ đứng thứ j khi sắp thứ tự

(Bản ghi r[index[j]] sẽ phải đứng sau j - 1 bản ghi khác khi sắp xếp)

Do khoá có vai trò đặc biệt như vậy nên sau này, khi trình bày các giải thuật, ta

sẽ coi khoá như đại diện cho các bản ghi và để cho đơn giản, ta chỉ nói tới giátrị của khoá mà thôi Các thao tác trong kỹ thuật sắp xếp lẽ ra là tác động lên

Trang 8

toàn bản ghi giờ đây chỉ làm trên khoá Còn việc cài đặt các phương pháp sắpxếp trên danh sách các bản ghi và kỹ thuật sắp xếp bằng chỉ số, ta coi như bàitập.

Bài toán sắp xếp giờ đây có thể phát biểu như sau:

Xét quan hệ thứ tự toàn phần "nhỏ hơn hoặc bằng" ký hiệu "≤" trên một tập hợp

S, là quan hệ hai ngôi thoả mãn bốn tính chất:

Trong trường hợp a ≤ b và a ≠ b, ta dùng ký hiệu "<" cho gọn

Cho một dãy k[1 n] gồm n khoá Giữa hai khoá bất kỳ có quan hệ thứ tự toàn phần "≤" Xếp lại dãy các khoá đó để được dãy khoá thoả mãn k[1]≤ k[2] ≤

…≤ k[n]

Giả sử cấu trúc dữ liệu cho dãy khoá được mô tả như sau:

const

n =…; {Số khoá trong dãy khoá, có thể khai báo dưới dạng biến số nguyên

để tuỳ biến hơn}

type

TKey = …; {Kiểu dữ liệu một khoá}

TArray = array[1 n] of TKey;

var

k: TArray; {Dãy khoá}

Thì những thuật toán sắp xếp dưới đây được viết dưới dạng thủ tục sắp xếp dãy khoá k, kiểu chỉ số đánh cho từng khoá trong dãy có thể coi là số nguyên

Integer

Trang 9

1.2 TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH C

1.2.1 Sự phát triển của ngôn ngữ lập trình C

C là một ngôn ngữ lập trình tương đối nhỏ gọn vận hành gần với phần cứng

và nó giống với ngôn ngữ Assembler hơn hầu hết các ngôn ngữ bậc cao Hơnthế, C đôi khi được đánh giá như là "có khả năng di động", cho thấy sự khácnhau quan trọng giữa nó với ngôn ngữ bậc thấp như là Assembler, đó là việc

mã C có thể được dịch và thi hành trong hầu hết các máy tính, hơn hẳn cácngôn ngữ hiện tại trong khi đó thì Assembler chỉ có thể chạy trong một số máytính đặc biệt Vì lý do này C được xem là ngôn ngữ bậc trung

C đã được tạo ra với một mục tiêu là làm cho nó thuận tiện để viết cácchương trình lớn với số lỗi ít hơn trong mẫu hình lập trình thủ tục mà lại khôngđặt gánh nặng lên vai người viết ra trình dịch C, là những người bề bộn với cácđặc tả phức tạp của ngôn ngữ Cuối cùng C có thêm những chức năng sau:

 Một ngôn ngữ cốt lõi đơn giản, với các chức năng quan trọng chẳng hạnnhư là những hàm hay việc xử lý tập tin sẽ được cung cấp bởi các bộ thưviện các thủ tục

 Tập trung trên mẫu hình lập trình thủ tục, với các phương tiện lập trìnhtheo kiểu cấu trúc

 Một hệ thống kiểu đơn giản nhằm loại bỏ nhiều phép toán không có ýnghĩa thực dụng

 Dùng ngôn ngữ tiền xử lý, tức là các câu lệnh tiền xử lý C, cho các nhiệm

vụ như là định nghĩa các macro và hàm chứa nhiều tập tin mãnguồn (bằng cách dùng câu lệnh tiền xử lý dạng #include chẳng hạn)

 Mức thấp của ngôn ngữ cho phép dùng tới bộ nhớ máy tính qua việc sửdụng kiểu dữ liệu pointer

 Số lượng từ khóa rất nhỏ gọn

 Các tham số được đưa vào các hàm bằng giá trị, không bằng địa chỉ

Trang 10

 Hàm các con trỏ cho phép hình thành một nền tảng ban đầu cho tínhđóng và tính đa hình.

 Hỗ trợ các bản ghi hay các kiểu dữ liệu kết hợp do người dùng từ khóađịnh nghĩa struct cho phép các dữ liệu liên hệ nhau có thể được tập hợplại và được điều chỉnh như là toàn bộ

Một số chức năng khác mà C không có (hay còn thiếu) nhưng có thể tìm thấy

 Quá tải và Quá tải toán tử,

 Các hỗ trợ cho đa luồng, đa nhiệm và mạng

Mặc dù C còn thiếu nhiều chức năng hữu ích nhưng lý do quan trọng để Cđược chấp nhận vì nó cho phép các trình dịch mới được tạo ra một cách nhanhchóng trên các nền tảng mới và vì nó cho phép người lập trình dễ kiểm soátđược những gì mà chương trình (do họ viết) thực thi Đây là điểm thường làmcho mã C chạy hiệu quả hơn các ngôn ngữ khác Thường thì chỉ có ngônngữ ASM chỉnh bằng tay chạy nhanh hơn (ngôn ngữ C), bởi vì ASM kiểm soátđược toàn bộ máy Mặc dù vậy, với sự phát triển các trình dịch C, và với sựphức tạp của các CPU hiện đại, C đã dần thu nhỏ khoảng cách khác biệt về vậntốc này

Một lý do nữa cho việc C được sử dụng rộng rãi và hiệu quả là do các trìnhdịch, các thư viện và các phần mềm thông dịch của các ngôn ngữ bậc cao kháclại thường được tạo nên từ C

Trang 11

1.2.2 Cấu trúc chương trình C

Một chương trình bao gồm một hoặc nhiều hàm, mỗi hàm được người lậptrình tổ chức để giải quyết một hoặc một số công việc nào đó của bài toán cầngiải quyết Một chương trình C để có thể thực thi được luôn cần phải có hàmmain()

 Cấu trúc cơ bản của chương trình như sau:

 Các #include ( dùng để khai báo sử dụng các hàm chuẩn)

 Các #define  ( dùng để định nghĩa các hằng )

 Khai báo các đối tượng dữ liệu ngoài ( biến, mảng, cấu trúc vv )

 Khai báo nguyên mẫu các hàm

"hello, world!" trên đầu ra chuẩn, mà thường là một màn hình Mặc dù vậy, nó

có thể xuất ra một tập tin hay xuất ra trên một thiết bị phần cứng kể cả trênmột vùng chứa, tùy thuộc vào việc đầu ra chuẩn được chỉ thị vào đâu khichương trình này được thực thi

Trang 12

trước cho bộ tiền xử lý biết thông qua các đường tìm kiếm đến các tập

tin header Tập hợp các tập tin được khai báo sử dụng qua các chỉ thị tiền xử lýcòn được gọi là các tập tin bao gồm

2 int main(void)

Dòng trên biểu thị một hàm chuẩn tên main Hàm này có mục đích đặc biệttrong C Khi chương trình thi hành thì hàm main() được gọi trước tiên Phần

mã int chỉ ra rằnggiá trị trả về của hàm main (tức là giá trị mà main() sẽ được

trả về sau khi thực thi) sẽ có kiểu là một số nguyên Còn phần mã (void) chobiết rằng hàm main sẽ không cần đến tham số để gọi nó Xem thêm Void

Dấu '{' cho biết sự bắt đầu của định nghĩa của hàm main

Trang 13

4 printf("hello, world\n");

Dòng trên gọi đến một hàm chuẩn khác tên là printf Hàm này đã được khaibáo trước đó trong tập tin stdio.h Dòng này sẽ cho phép tìm và thực thi mã (đãđược hỗ trợ sẵn) với ý nghĩa là hiển thị lên đầu ra chuẩn dòng chữhello, world<kí tự xuống dòng EOL-chuyển dấu nhắc sang dòng mới>

Mã kí tự \n là một dãy thoát được chuyển dịch thành dấu kí tự EOL (viết tắt từ chữ End-Of-Line) có nghĩa là chuyển vị trí dấu nhắc xuống đầu một dòng kế.Gía trị trả về của hàm printf (theo khai báo nguyên mẫu chuẩn của hàm nàytrong C) có kiểu int, nhưng vì giá trị trả về này không được (người lập trình)dùng tới nên giá trị đó bị bỏ qua (một cách lặng lẽ)

5 return 0;

Dòng này sẽ kết thúc việc thực thi mã của hàm main và buộc nó trả về giá trị

0 (là một số nguyên như khai báo ban đầu int main )

6 }

Dấu '}' cho biết việc kết thúc mã cho hàm main

1.2.3 Các kiểu dữ liệu và khai báo biến

C có một hệ thống kiểu tương tự như của Pascal, mặc dù chúng khác nhautrong một số khía cạnh Có nhiều kiểu cho các số nguyên với nhiều cỡ cho cóđấu và không có dấu, có kiểu số floating point, kiểu các kí tự char, các kiểu thứ

tự enum, kiểu bản ghi record và kiểu đơn vị union

C tạo ra sự mở rộng mạnh mẽ việc sử dụng của kiểu các con trỏ pointer,một dạng đơn giản các tham chiếu mà chúng chứa địa chỉ các vùng nhớ Các

con trỏ có thể được tham chiếu ngược (dereference) để lấy về giá trị của dữ

liệu được chứa trong địa chỉ đó (địa chỉ mà con trỏ chỉ vào) Địa chỉ này có thể

Trang 14

được điều chỉnh bằng các phép gán thông thường và các phép toán số học trêncon trỏ Trong thời gian thực thi, một con trỏ đại diện cho một địa chỉ của bộnhớ Trong thời gian chuyển dịch, nó là một kiểu phức tạp đại diện cho cả địachỉ và kiểu của dữ liệu Điều này cho phép các biểu thức bao gồm các con trỏđược kiểm tra về kiểu Các con trỏ thì được dùng cho nhiều mục tiêu trong C.Các dòng kí tự string thường được đại diện bởi một con trỏ chỉ tới một dãy củacác kí tự Sự cấp phát bộ nhớ động, được miêu tả sau đây, thì được tiến hànhthông qua các con trỏ.

Một con trỏ rỗng có nghĩa là nó không chỉ đến một chỗ nào hết Điều này

có ích trong những trường hợp như là con trỏ next trong một nút cuối của

một danh sách liên kếtlinked list Việc tham chiếu ngược một con trỏ trống gây

ra các biểu hiện không dự đoán trước được Các con trỏ kiểu void thì lại có thểchỉ đến một đối tượng mà không cần biết kiểu của đối tượng đó Điều này đặcbiệt hữu dụng trong lập trình tiêu bản bởi vì cỡ và kiểu của các đối tượng màchúng chỉ tới thì không thể biết được và do đó không thể thực hiện tham chiếungược, nhưng chúng lại có thể được hoán chuyển thành các con trỏ của cáckiểu khác Các kiểu mảng array trong C thì có cỡ cố định, độ lớn tĩnh của nóphải được biết trước trong thời gian chuyển dịch Điều này gây nhiều trở ngạitrong thực tế bởi vì người ta có thể chỉ định các vùng nhớ ở thời gian thực thidựa trên các thư viện chuẩn và hành xử chúng như là các mảng Không như cácngôn ngữ khác, C biểu thị các mảng giống như trường hợp các con trỏ: chúngđóng vai trò một địa chỉ của bộ nhớ và một kiểu dữ liệu Do đó, các giá trị chỉ

số có thể vượt quá cỡ của một mảng

C cũng cung cấp các kiểu mảng đa chiều Các giá trị chỉ số của các mảng

đa chiều thì được gán theo thứ tự hàng chính Một cách có ý nghĩa thì cácmảng này hoạt động như là mảng của các mảng nhưng thực chất chúng đượcphân bố như là mảng một chiều với việc tính và tạo các vị trí tương đối

Trang 15

C thường được dùng trong việc lập trình các hệ thống bậc thấp, ở đó có thể

cần thiết để xem số nguyên như là một địa chỉ của bộ nhớ, là một giá trị double precision, hay là một kiểu con trỏ Trong các trường hợp này, C cung cấp việc hoán chuyển, mà phép toán này sẽ bắt buộc chuyển đổi giá trị từ một kiểu sang một kiểu khác Dùng phép hoán chuyểnsẽ làm mất đi phần nào tính an

toàn mà thường được cung cấp bởi hệ thống kiểu

Các đoạn mã lệnh trong các mô-đun được viết bằng ngôn ngữ hệ thống cócấu trúc (cú pháp) và các từ khoá riêng Cú pháp ngôn ngữ lập trình hệ thống

có thể được viết bằng tiếng Nga hoặc tiếng Anh, ngoại trừ một vài từ khoá màkhông có tương đương trong tiếng Nga, ví dụ, Null

Các toán tử của ngôn ngữ lập trình hệ thống được tách biệt với nhau bằngdấu chấm phảy (;), nhưng sau từ khoá EndProcedrure hoặc EndFunction thìkhông đặt dấu chấm phẩy, vì đây không phải là toán tử mà là khoảng giới hạnđoạn lệnh

Dưới đây là giới thiệu về cú pháp của ngôn ngữ lập trình hệ thống

Điều kiện

Cú pháp “If Then…”

Dùng để kiểm tra biểu thức logic và hoàn toàn tương tự như các ngôn ngữlập trình khác

Trang 16

CHƯƠNG 2 THUẬT TOÁN HEAP SORT

2.1 Ý TƯỞNG

HeapSort được đề xuất bởi J.W.J.Williams năm 1981, thuật toán khôngnhững đóng góp một phương pháp sắp xếp hiệu quả mà còn xây dựng mộtcấu trúc dữ liệu quan trọng để biểu diễn hàng đợi có độ ưu tiên: Cấu trúc dữliệu Heap

Đầu tiên, dãy khoá k[1 n] được vun từ dưới lên để nó biểu diễn một đống,khi đó khoá k[1] tương ứng với nút gốc của đống là khoá lớn nhất, ta đảo giátrị khoá đó cho k[n] và không tính tới k[n] nữa (hình dưới) Còn lại dãy khoák[1 n-1] tuy không còn là biểu diễn của một đống nữa nhưng nó lại biểu diễncây nhị phân hoàn chỉnh mà hai nhánh cây ở nút thứ 2 và nút thứ 3 (hai nútcon của nút 1) đã là đống rồi Vậy chỉ cần vun một lần, ta lại được mộtđống,đảo giá trị k[1] cho k[n-1] và tiếp tục cho tới khi đống chỉ còn lại 1 nút(hình dưới)

Ví dụ: Đảo giá trị k[1] cho k[n] và xét phần còn lại:

1 0

Trang 17

-Vun phần còn lại thành đống rồi lại đảo trị k[1] cho k[n-1]

2.2 NỘI DUNG

2.2.1 Các tính chất của Heap

Giả sử xét trường hợp sắp xếp tăng dần, khi đó heap được định nghĩa là mộtdãy các phần tử a ,a ,….a thỏa mãn các quan hệ sau với mọi i [ p, q ]

Trang 18

2.2.2 Giải thuật Heap Sort

Giải thuật Heapsort trải qua 2 giai đoạn

- Giai đoạn 1: Hiệu chỉnh dãy số ban đầu thành heap

- Giai đoạn 2: Sắp xếp dãy số dựa trên heap

Bước 1:  Ðưa phần tử  lớn nhất về vị trí đúng ở cuối dãy

  r = n; Hoánvị (a , a )Bước 2: Loại bỏ phần tử lớn nhất ra khỏi heap: r = r-1;

Hiệu chỉnh phần còn lại của dãy từ  a , a2 a thành một heap

Bước 3:  Nếu r > 1 (heap còn phần tử ): Lặp lại Bước 2

Ngược lại: Dừng

Dựa trên tính chất 3, ta có thể thực hiện giai đoạn 1 bằng cách bắt đầu từheap mặc nhiên an/2+1, an/2+2 an, sau đó thêm dần các phần tử an/2,an/2-1, …, a1 ta sẽ nhận được heap theo mong muốn

2.2.3 Ðánh giá giải thuật

Trong giai đoạn sắp xếp ta cần thực hiện n-1 bước mỗi bước cần nhiều nhất là log2(n-1), log2(n-2), … 1 phép đổi chỗi

Như vậy độ phức tạp thuật toán Heap sort O(nlog2n)

2.3 THỦ TỤC HEAP SORT

- Thủ tục Adjust (root, endnode) vun cây gốc root thành đống trong điều kiệnhai cây gốc 2.root và 2.root + 1 đã là đống rồi Các nút từ endnode + 1 tới n

đã nằm ở vị trí đúng và không được tính tới nữa

- Thủ tục HeapSort mô tả lại quá trình vun đống và chọn khoá theo ý tưởngtrên

2.4 VÍ DỤ

Cho dãy số a

12 2        8          5          1          6          4          15

Ngày đăng: 30/08/2017, 09:24

w