C (二叉)堆 堆排序和用堆實現的優先佇列

2022-06-30 22:57:10 字數 3873 閱讀 6308

完全二叉樹:

1、除最後一層外,其他層結點數應該達到最大值。2、最後一層結點都連續集中在左側

二叉堆:

1、二叉堆是一顆完全二叉樹

2、最大堆:父結點的值總是不小於任何乙個子結點的值

3、最小堆:父結點的值總是不大於任何子結點的值   

建立乙個二叉最大t堆

usintg

system;

using

system.collections.generic;

using

system.text;

namespace

排序演算法

public maxheap() : this(10

)

public

intcount

}public

bool

isempty

}//插入乙個元素

public

void

insert(e e)

heap[n + 1] =e;

n++;

swim(n);

}public

e removemax()

return

max;

}public

e max()

else

}//下沉操作

private

void sink(int

k)

if(heap[k].compareto(heap[j]) >= 0

)

swap(k, j);

k =j;}}

//元素上游

private

void swim(int

k)

}private

void swap(int i, int

j)

private

void resetcapacity(int

newcapacity)

heap =newheap;

}public

override

string

tostring()

}"]");

return

res.tostring();}}

}

建立乙個最小堆:

using

system;

using

system.collections.generic;

using

system.text;

namespace

排序演算法

public minheap() : this(10

)

public

intcount

}public

bool

isempty

}//插入乙個元素

public

void

insert(e e)

heap[n + 1] =e;

n++;

swim(n);

}public

e removemin()

return

min;

}public

e min()

else

}//下沉操作

private

void sink(int

k)

if (heap[k].compareto(heap[j]) <= 0

)

swap(k, j);

k =j;}}

//元素上游

private

void swim(int

k)

}private

void swap(int i, int

j)

private

void resetcapacity(int

newcapacity)

heap =newheap;

}public

override

string

tostring()

}"]");

return

res.tostring();}}

}

堆排序:

namespace

排序演算法

for(int i = n -1; i >= 0; i--)}}

}

上面堆排序的時間複雜度是o(n)

下面是用原地堆排序時間複雜度是o(logn)

namespace

排序演算法

for(int i = n -1; i >= 0; i--)}}

}

最大堆佇列

using

system;

using

system.collections.generic;

using

system.collections.immutable;

using

system.runtime.compilerservices;

using

system.text;

namespace

排序演算法

public

maxpq()

public

int count }

public

bool isempty }

public

e dequeue()

public

void

enqueue(e e)

public

e peek()

public

override

string

tostring()}}

最小堆佇列:

using

system;

using

system.collections.generic;

using

system.collections.immutable;

using

system.runtime.compilerservices;

using

system.text;

namespace

排序演算法

public

minpq()

public

int count }

public

bool isempty }

public

e dequeue()

public

void

enqueue(e e)

public

e peek()

public

override

string

tostring()}}

優先對列使用場景:可以動態處理資料。

優先佇列 二叉堆,堆排序

2.4 優先佇列 二叉堆 簡介 可以刪除最大元素和插入元素 特點 高效 對數級別的 刪除最大元素和插入元素操作 public class priorityheap public priorityheap int initsize 獲取最小的元素 public int min 刪除最小的元素 publ...

二叉堆 堆排序

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...

二叉堆 堆排序

推薦 某cppblog wutianqi sblog 堆排序實現 include using namespace std 輸出當前堆的排序狀況 void printarray int data,int size 建堆 自底而上地呼叫maxheapify來將乙個陣列a 1.size 變成乙個最大堆 注...