Heap sort Giới thiệu: - Sắp xếp vun đống heapsort là 1 trong các phương pháp sắp xếp chọn chọn phần tử lớn nhất hoặc nhỏ nhất đặt vào cuối hoặc đầu danh sách, sau đó tiếp tục với phần cò
Trang 1HEAP SORT
Trang 2Heap sort
Giới thiệu:
- Sắp xếp vun đống (heapsort) là 1 trong các phương pháp sắp xếp chọn (chọn phần tử lớn nhất (hoặc
nhỏ nhất) đặt vào cuối (hoặc đầu) danh sách, sau
đó tiếp tục với phần còn lại của danh sách)
- Sắp xếp chọn có độ phức tạp O(n2) Nhưng
Heapsort sử dụng cấu trúc dữ liệu đặc biệt được
gọi là đống (heap) độ phức tạp O(nlgn)
Trang 3Heap sort
Giới thiệu:
- Khái niệm heap và phương pháp sắp xếp Heapsort
do J.Williams đề xuất
- Đống là cây nhị phân mà giá trị ở mỗi đỉnh cha lớn hơn hoặc bằng giá trị các đỉnh con
- Một khi danh sách dữ liệu đã được vun thành
đống, gốc của nó là phần tử lớn nhất, thuật toán sẽ giải phóng nó khỏi đống để đặt vào cuối danh
sách
Trang 4Heap sort
Giải thuật:
- Xem danh sách n phần tử là cây nhị phân
- Cây nhị phân được xác định như sau: tại nút thứ i tương ứng với chỉ số thứ i của mảng có con trái là nút 2*(i+1)-1 và con phải 2*(i+1) nếu 2*(i+1)-1 và 2*(i+1) nhỏ hơn n
- Xây dựng Heap: mọi nút cha đều có giá trị lớn hơn nút con Khi đó nút gốc là nút có giá trị lớn nhất
- Hoán vị nút gốc với nút thứ n – 1 và xây dựng lại Heap mới với n – 2 nút
Trang 5Heap sort
Ví dụ: Cho dãy 11 3 5 4 9 15 19 7
XD Heap 8
(A[0],A[7])
Trang 6Heap sort
(A[0],A[6])
(A[0],A[5])
Trang 7Heap sort
(A[0],A[4])
(A[0],A[3])
Trang 8Heap sort
(A[0],A[2])
Swap
(A[0],A[1])
Được dãy đã sắp xếp
Trang 9Heap sort
Code:
//hoan vi nut cha thu i phai lon hon nut con
void Heapify (int A[],int n, int i)
if(Right<n && A[Right]>A[Largest])
Largest = Right;
if(i!=Largest)
Heapify(A,n,Largest);
} }
Trang 10Heap sort
//xay dung Heap sao cho moi nut cha luon lon hon nut con
void BuildHeap (int A[], int n)
{ for(int i = n/2-1; i>=0; i )
Heapify(A,n,i);
}
void HeapSort (int A[], int n)
{ BuildHeap(A,n);
for(int i = n-1; i>0; i )
Heapify(A,i,0);
} }