Thuật Toán Heap Sort Là Gì, Thuật Toán Sắp Xếp Vun Đống (Heap Sort)

Cây nhị phân là một trong cây, mỗi nút ít bên trên cây tất cả buổi tối đa nhì nhánh bé, nút trang bị i sẽ sở hữu 2 nhỏ là 2i với 2i+1.

Bạn đang xem: Thuật toán heap sort là gì, thuật toán sắp xếp vun Đống (heap sort)


*

Cây nhị phân

Heap là một câu trúc cây nhị phân không hề thiếu, mỗi nút bên trên cây đầy đủ đựng một nhãn tất cả độ ưu tiên cao hơn nữa các con của chính nó, nút gốc (root) là nút ít gồm độ ưu tiên cao nhất. lấy ví dụ như heap min là cây là đông đảo con của nút i đều phải có cực hiếm >= heap, heap max thì hầu hết nút ít con đông đảo nhỏ rộng nút ít cha.

Heap nhị phân được áp dụng rộng thoải mái dùng làm thiết đặt một hàng đợi ưu tiên, tốt là trong thuật toán thù Distra search lối đi nđính độc nhất vô nhị, và vào bài bác này ta đã sử dụng Binary Heap để thu xếp mảng.

Các thao tác hay được sử dụng trên Heap là

Tìm nút gồm độ ưu tiên cao nhấtThêm một nút vào heapXóa bỏ nút ít nơi bắt đầu, nút bao gồm độ ưu tiên cao nhất.Xây dựng heap từ tập gồm n phần tử

Để tìm nút có độ ưu tiên tối đa, ta chỉ cần mang nút gốc.

Để thêm 1 nút ít vào heap

Nếu heap trống rỗng thì ta chỉ cần cầm cội bằng nút ít đóNếu heap ko rỗngChọn vị trí để thêm nút.Giả sử heap bao gồm chiều cao là h, với đầy đủ nút làm việc độ dài h-1 tất cả một nút ít nào kia không đủ 2 con (tổng thể nút sinh sống chiều cao kia Nếu sống độ dài h đang không thiếu thốn nút thì thêm nút vào chiều cao h+1Tiến hành vun đống nút bên dưới lên, giả dụ nút ít cha tất cả độ ưu tiên rẻ hơn nút ít bé thì triển khai thay đổi vị trí nút con và nút ít phụ thân, sau đó lại xét tiếp nút phụ vương kia cho đến bao giờ thỏa mãn nút ít thân phụ có độ ưu tiên hơn nút chon hoặc nút ít đã xét là nút ít phụ vương thì thôi.

Xem thêm: Cách Sử Dụng Mặt Nạ Ngủ Là Gì? Cách Sử Dụng Như Thế Nào Để Da Mặt Đẹp

Để xóa nút gốc

Nếu cây kia chỉ có một nút thì chỉ xóa nút ít đóNếu cây có rất nhiều rộng 1 nút là thực hiện rước nút bên dưới cần sử dụng mặt bắt buộc cụ vào nút ít gốc kế tiếp thực hiện quy trình down heap.Quá trình down heap, so sánh độ ưu tiên đối với cả hai nút ít con(trường hợp có) , giả dụ độ ưu tiên rẻ rộng 1 trong các 2 nút nhỏ hoặc rẻ hơn cả hai nút nhỏ thì triển khai chọn nút gồm độ ưu tiên cao nhất trong 2 nút ít bé với thay đổi vị trị với nó, cho tới bao giờ nút sẽ xét là nút ít lá ( không tồn tại nút ít con)

Độ phức hợp.

Thao tác đem nút nơi bắt đầu O(1)Thao tác thêm nút new vào cây O(log N)Thao tác xóa nút nơi bắt đầu : Tổng O(log N)Thao tác xóa nút ít cội O(1)Thao tác down heap O(log N)

Áp dụng đặc điểm của Heap nhằm sắp đến xếp

Trong phần này mình đang xúc tiến thuật toán thù thu xếp nhanh hao bằng cách áp dụng tính chất, nút ít nơi bắt đầu là nút ít bao gồm độ ưu tiên tối đa, bản thân sẽ xây dựng dựng một heap từ bỏ mảng a có n bộ phận tiếp nối, đem lần lượt những phần tử vào heap ra thì mình gồm tất cả những giá trị kéo ra tất cả độ ưu tiên sút dần.

Ngôn ngữ triển khai. : Go

Cấu trúc Heap : struct Heap bao gồm field Leng, là độ nhiều năm của Heap cùng field Value là quý hiếm của các thành phần trong heap.

type Heap struct Leng intValue <>intThao tác khởi tạo ra Heap : Mình sẽ xây dựng heap Min tùy chỉnh cấu hình Leng = 0, heap rỗng

const nMax = 10000const maxValue = 100000000func init() h.Leng = 0h.Value = make(<>int, nMax+1, nMax+1)Thao tác thêm một phần tử vào Heap : Thêm vào với tiếp nối vun đống từ bên dưới lên qua function UpHeap.

func (h *Heap) Insert(x int) *Heap h.Leng++h.Value = xh.UpHeap(h.Leng)return hThao tác UpHeap

func (h *Heap) UpHeap(i int) *Heap t := h.Valueh.Value = h.Valueh.Value = th.UpHeap(int(math.Floor(float64(i) / 2)))return h}Thao tác xóa nút ít gốc : Sau Lúc vứt bỏ nút ít gốc, ta lấy thành phần ngoại trừ thuộc ở chiều cao tối đa cầm cố vào nút nơi bắt đầu sau đó tiến hành quá trình DownHeap từ nút gốc

func (h *Heap) RemoveRoot() *Heap h.Value<1> = h.Valueh.Leng--if h.Leng > 1 h.DownHeap(1) return hThao tác DownHeap

func (h *Heap) DownHeap(i int) *Heap m := i * 2if m > h.Leng return hif h.Value > h.Value m++if h.Value t := h.Valueh.Value = h.Valueh.Value = th.DownHeap(m)return hreturn h}Hàm Main : Tạo mảng a sau đó đẩy mỗi bộ phận của a vào Heap, tiếp nối rước trong heap ra từ từ ta gồm công dụng theo độ ưu tiên giảm giần

func main() a := <>int8, 6, 4, 5, 7, 9, 2, 3, 2, 2, 6, 3, 6, 3, 6, 123, 6541, 3, 6, 3, 461, 35, 2for _, v := range a h.Insert(v)for i := 1; i fmt.Print(h.Value<1>,)h.RemoveRoot()}Kết Quả

2 2 2 2 3 3 3 3 3 4 5 6 6 6 6 6 7 8 9 35 123 461 6541Full tệp tin heap.go

package mainimport ("fmt""math")type Heap struct Leng intValue <>intvar h Heapconst nMax = 10000const maxValue = 100000000func init() h.Leng = 0h.Value = make(<>int, nMax+1, nMax+1)func (h *Heap) Insert(x int) *Heap h.Leng++h.Value = xh.UpHeap(h.Leng)return hfunc (h *Heap) UpHeap(i int) *Heap if (i == 1) t := h.Valueh.Value = h.Valueh.Value = th.UpHeap(int(math.Floor(float64(i) / 2)))return h}func (h *Heap) DownHeap(i int) *Heap m := i * 2if m > h.Leng return hif h.Value > h.Value m++if h.Value t := h.Valueh.Value = h.Valueh.Value = th.DownHeap(m)return hreturn h}func (h *Heap) RemoveRoot() *Heap h.Value<1> = h.Valueh.Leng--if h.Leng > 1 h.DownHeap(1)return hfunc main() a := <>int8, 6, 4, 5, 7, 9, 2, 3, 2, 2, 6, 3, 6, 3, 6, 123, 6541, 3, 6, 3, 461, 35, 2for _, v := range a h.Insert(v)for i := 1; i fmt.Print(h.Value<1>, " ")h.RemoveRoot()}Thuật toán Heap Sort áp dụng đặc điểm hơi đơn giản và dễ dàng của Heap tuy vậy nếu như là mình Khi sort thì bản thân Lúc sort bản thân đã áp dụng QuickSort để ngăn cản Việc thiếu tính một mớ mem mang lại dòng heap.

Mình đã thực hiện tiếp Quiông chồng Sort trong phần sau của bài xích, cảm ơn chúng ta đã phát âm :D