go 小頂堆以及優先級隊列實現

小頂堆node

//複雜度  O(nlogn)
type MinHeap struct {
	Size int
	Node []int
}

func NewHeap(max int) *MinHeap {
	return &MinHeap{Node: make([]int, max), Size: 0}
}

func (heap *MinHeap) Push(a int) {

	i := heap.Size
	heap.Size++
	for {
		if i <= 0 {
			break
		}
		parent := (i - 1) / 2
		if heap.Node[parent] <= a {
			break
		}
		heap.Node[i] = heap.Node[parent]
		i = parent
	}

	heap.Node[i] = a
}

func (heap *MinHeap) Pop() int {
	if heap.Size == 0 {
		return 0
	}

	//彈出根節點
	root := heap.Node[0]

	heap.Size--

	last := heap.Node[heap.Size]

	//fmt.Println(root, last)
	i := 0
	heap.Node[heap.Size] = 0
	for {

		left := 2*i + 1
		right := 2*i + 2

		//左節點超出邊界 則break
		if left >= heap.Size {
			break
		}
		if right < heap.Size && heap.Node[right] < heap.Node[left] {
			left = right
		}
		if heap.Node[left] >= last {
			break
		}
		heap.Node[i] = heap.Node[left]
		i = left
	}
	heap.Node[i] = last
	return root
}

func (heap *MinHeap) Sort() []int {
	length := len(heap.Node)
	arr := make([]int, length)
	for i := 0; i < length; i++ {
		arr[i] = heap.Pop()
	}
	return arr
}
func main() {

	myqueue := queue.NewQueue(100)
	node1 := queue.Node{
		Point: 3,
		Val:   "aaa",
	}
	node2 := queue.Node{
		Point: 5,
		Val:   "bbb",
	}
	node3 := queue.Node{
		Point: 10,
		Val:   "ccc",
	}
	node4 := queue.Node{
		Point: 8,
		Val:   "ccc",
	}
	myqueue.Push(node1)
	myqueue.Push(node2)
	myqueue.Push(node3)
	myqueue.Push(node4)

	fmt.Println(myqueue)
	fmt.Println(myqueue.Pop())
	fmt.Println(myqueue)
	fmt.Println(myqueue.Top())

	heap := NewHeap(100)
	heap.Push(3)
	heap.Push(6)
	heap.Push(7)
	heap.Push(10)
	heap.Push(1)
	heap.Push(2)
	heap.Push(3)
	heap.Push(9)
	fmt.Println(heap)
	/*	fmt.Println(heap.Pop())
		fmt.Println(heap)
		fmt.Println(heap.Pop())
		fmt.Println(heap.Pop())
		fmt.Println(heap.Pop())*/
	/*fmt.Println(heap.Pop())
	fmt.Println(heap.Pop())
	fmt.Println(heap.Pop())*/
	/*heap.Push(27)
	heap.Push(1)
	heap.Push(2)
	heap.Push(3)*/

	fmt.Println(heap.Sort())
}
複製代碼

優先級隊列bash

//優先級隊列實現
type PriorityQueueInterface interface {
	GetSize() int
	IsEmpty() bool
	Push(node Node)
	Pop() *Node
	Top() *Node
}

//按照分數大小排列
type PriorityQueue struct {
	Size int
	Item []Node
}

type Node struct {
	Point int    //分數
	Val   string //值
}

func NewQueue(max int) PriorityQueueInterface {
	return &PriorityQueue{Size: 0, Item: make([]Node, max)}
}

func (p *PriorityQueue) GetSize() int {
	return p.Size
}

func (p *PriorityQueue) IsEmpty() bool {
	return len(p.Item) == 0
}

func (p *PriorityQueue) Push(node Node) {

	i := p.Size
	p.Size++

	for {
		if i <= 0 {
			break
		}

		parent := (i - 1) / 2

		fmt.Println(parent, p.Item[parent], p.Item[i])

		if p.Item[parent].Point >= node.Point {
			break
		}
		p.Item[parent], p.Item[i] = p.Item[i], p.Item[parent]
		i = parent
	}

	p.Item[i] = node
}

func (p *PriorityQueue) Pop() *Node {

	if p.Size == 0 {
		return nil
	}
	root := p.Item[0]
	i := 0
	p.Size--

	last := p.Item[p.Size]
	p.Item[p.Size] = Node{}

	for {
		left := 2*i + 1
		right := 2*i + 2

		if left >= p.Size {
			break
		}

		if right > p.Size && p.Item[left].Point < p.Item[right].Point {
			left = right
		}

		if p.Item[left].Point < last.Point {
			break
		}

		p.Item[i], p.Item[left] = p.Item[left], p.Item[i]
		i = left
	}

	p.Item[i] = last
	return &root
}

func (p *PriorityQueue) Top() *Node {
	return &p.Item[0]
}
複製代碼
相關文章
相關標籤/搜索