SẮP XẾP VUN ĐỐNG (HEAP SORT)

Một phần của tài liệu Giáo trình Cấu trúc dữ liệu và giải thuật Công nghệ thông tin (Trang 49 - 63)

1 .GIỚI THIỆU

3. MỘT SỐ THUẬT TOÁN SẮP XẾP

3.8 SẮP XẾP VUN ĐỐNG (HEAP SORT)

Định nghĩa 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ì hai 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 n/2 khơng có con, do đó là lá).

Ví dụ mảng (45,23,35,13,15,12,15,7,9) là một đống

 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ử ln ln 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à phần tử nhỏ nhất.

45

Việc sắp xếp lại các phần tử của một mảng ban đầu sao cho nó trở thành đống được gọi là vun đống.

Giải thuật

Bước 1: Xây dựng heap từ mảng ban đầu.

Bước 2: Hoán vị phần tử đầu và cuối mảng, rồi giảm dần số phần tử của mảng

xuống thành n-1 (bỏ phần tử cuối).

Bước 3: Tiếp tục xây dựng và hoán vị như trên cho đến hết ta sẽ có dãy được

sắp thứ tự tăng dần (muốn sắp giảm dần ta chi cần cho phần tử gốc của heap là phần tử nhỏ nhất)

Mô phỏng giải thuật

Ví dụ: Cho dãy : 15 , 19 , 10 , 7 , 17 , 16

Giai đoạn 1: tạo heap: i= [0+length]/2=[0+5]/2=2, (ai, a2*i); (ai , a2*i+1) trong đó: (ai,a2*i), (ai, a2*i+1) là các cặp phần tử liên đới, nếu thỏa thì i = i -1, khơng thi hốn vị (ai, a2*i+1).

46

47

Giai đoạn 2: Sắp xếp dựa trên heap, phần tử đầu heap lớn nhất dãy, trong quá trình

sắp xếp nếu mảng khơng cịn là heap thì phải hiệu chỉnh lại.

48

Sau khi đưa phần tử ở gốc cây (phần tử lớn nhất của cây Heap) ra khỏi cây (đưa về cuối mảng) thì chúng ta tiếp tục bước chỉnh cây cịn lại thành cây Heap. Nhưng không cần phải lặp lại thao tác từ đầu mà chỉ lan chuyền hiệu chỉnh trên những nút bị tác động khi bỏ phần tử ở gốc cây ra ngoài.

49

Đến đây ta lại thu được cây có tính chất Heap mới. Và tiếp tục lấy nút ở gốc cây ra khỏi cây (đưa về cuối dãy hiện hành). Và cứ như thế cho đến khi cây chỉ còn 1 phần tử thì ngừng lại.

53

Cài đặt

54

 Giai đoạn hiệu chỉnh a0,..an-1 thành Heap

55

Độ phức tạp

Trường hợp tốt nhất T(n) = O(nlogn). Trường hợp xấu nhất T(n) = O(nlogn). Trường hợp trung bình T(n) = O(nlogn).

BÀI TẬP

Xây dựng ứng dụng quản lý sinh viên của trường ABC. Biết rằng mỗi sinh viên cần lưu trữ thông tin sau:

- Mã sinh viên: kiểu chuỗi

- Họ tên: kiểu chuỗi (có khoảng trắng) - Năm sinh: số nguyên

- Danh sách các môn học (Mỗi môn học cần lưu trữ Mã mơn, tên mơn, số tín chỉ, điểm. Và số môn học có thể khác nhau đối với các Sinh viên khác nhau) struct MonHoc { string mamh; string tenMon; int tinChi;

56 float diem }; struct SinhVien { string masv; string hoTen; int namSinh; MonHoc arrMon[30]; int nSoMon; }; Các chức năng cần có trong ứng dụng: 1. Nhập một danh sách gồm n Sinh viên

2. Hiển thị danh sách sinh viên lên màn hình (định dạng xuất dưới dạng bảng).

MaSV: tt1 Họ tên: Le Hoa

Năm Sinh: 1990

Danh Sách 2 môn học đã học:

Mã Mơn Tên Mơn Tín chỉ ĐTB

Ctdl Cấu trúc dữ liệu &GT 3 5 Ktlt1 Kỹ thuật lt1 3 5

************************************************

MaSV: tt2 Họ tên: Le Tuan

Năm Sinh: 1990

Danh sách 2 môn học đã học:

Mã Môn Tên Mơn Tín chỉ ĐTB

th Tin học 3 7

57

3. Tìm kiếm sinh viên có mã sinh viên là x, sau đó sửa họ tên của sinh viên thành y (sử dụng thuật tốn tìm kiếm tuần tự) (x, y được cấp từ người dùng) 4. Nhập vào 2 số x, y (x < y) và đếm xem có bao nhiêu Sinh viên có điểm

trung bình nằm trong đoạn [x, y].

Biết cơng thức tính điểm trung bình = (diemMon1 * tinChi1 + diemMon2 * tinChi2 +…)/ (tinChi1 + tinChi2+…)

5. Sắp xếp các sinh viên theo họ tên giảm dần và in kết quả ra màn hình( dùng giải thuật sắp xếp chèn – InsertionSort).

6. Dùng thuật tốn tìm kiếm nhị phân để tìm và sửa điểm mơn A cho sinh viên có họ tên là x. (lưu ý gọi hàm sắp xếp để sắp xếp danh sách theo họ tên trước khi áp dụng tìm kiếm nhị phân)

7. Sắp xếp danh sách sinh viên tăng dần theo điểm trung bình dùng giải thuật sắp xếp chọn - selection sort.

8. In ra danh sách tên của các sinh viên được học bổng: điểm trung bình >=7.0, khơng có mơn nào <5 và số sinh viên được học bổng không quá 10% tổng số.

58

Một phần của tài liệu Giáo trình Cấu trúc dữ liệu và giải thuật Công nghệ thông tin (Trang 49 - 63)

Tải bản đầy đủ (PDF)

(151 trang)