HEAP SORT HEAP SORT Heap sort 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òn lại của danh sách). - Sắp xếp chọn có độ phức tạp O(n 2 ). 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) Heap sort Heap 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. Heap sort Heap 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. Heap sort Heap sort Ví dụ: Cho dãy 11 3 5 4 9 15 19 7 XD Heap 8 Swap XD Heap 7 (A[0],A[7]) Heap sort Heap sort Swap XD Heap 6 (A[0],A[6]) Swap XD Heap 5 (A[0],A[5]) Heap sort Heap sort Swap XD Heap 4 (A[0],A[4]) Swap XD Heap 3 (A[0],A[3]) Heap sort Heap sort Swap XD Heap 2 (A[0],A[2]) Swap (A[0],A[1]) Đượ c dãy đ ã s ắ p x ế p Heap sort Heap sort Code: //hoan vi nut cha thu i phai lon hon nut con void Heapify (int A[],int n, int i) { int Left = 2*(i+1)-1, Right = 2*(i+1), Largest; if(Left<n && A[Left]>A[i]) Largest = Left; else Largest = i; if(Right<n && A[Right]>A[Largest]) Largest = Right; if(i!=Largest) { Swap(A[i],A[Largest]); Heapify(A,n,Largest); } } Heap sort Heap 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 ) { Swap(A[0],A[i]); Heapify(A,i,0); } } . (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(n 2 ). Nhưng Heapsort sử dụng cấu trúc dữ liệu đặc biệt đượ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. Heap sort Heap sort Giải thuật: - Xem danh sách n phần tử là cây nhị phân 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