最大索引堆是為了防止swap()交換大型資料帶來的低效率,所以只交換索引。所以成員變數上比最大堆多了乙個儲存索引的陣列indexs,為了更方便快捷找到某個索引在indexs中的位置,因此又新增了乙個儲存索引位置的陣列reverse,reverse[i]的值表示索引i在indexs[j]==i中的位置j;即indexs[reverse[i]]=i。
public class indexheap
this.capacity=capacity;
this.count=0;
} //將乙個無序陣列構造成乙個最大堆 相當於堆排序
public indexheap(int arr,int n) }
private void shiftup(int i)
if(data[indexs[k]]>=data[indexs[j]]) //如果父節點大於等於子節點,則停止迴圈
break;
swap(indexs,k,j);
reverse[indexs[k]]=k;
reverse[indexs[j]]=j;
k=j; //k被賦為當前位置,為下次迴圈做初始化
} }public int size()
public boolean isempty()
public void insert(int i,int a)
public int extractmaxindex()
public boolean contain(int i)
public int getdata(int i)
//修改i索引的data值
public void set(int i,int newitem)
// }
//方法二:********優化******************
int j=reverse[i]; //優化結果:時間複雜度o(logn)
進擊的堆 最大索引堆
文章儲存在github,網速不佳的朋友,請看 進擊的堆 最大索引堆 或者 來我的技術小站 godbmw.com 堆結構的資料增刪操作,需要swap操作。雖然可以被優化成每次一次賦值,然而當元素型別是複雜資料機構 例如 類 浮點數 結構體等 賦值操作的消耗不容小覷。因此,如果可以通過交換整數資料,來實...
堆與最大堆
這篇部落格主要敘述最大堆 資料結構中的堆和作業系統的堆有點不太一樣 作業系統的堆大多用鍊錶的形式,而資料結構中的堆使用的是完全二叉樹.既然它是乙個完全二叉樹,因此就有一下性質 葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹 來自度娘 也就是說,增加結點時只能...
二叉堆 最大堆實現
include include include include include include using namespace std template typename item class maxheap void shiftdown int k public 建構函式,構造乙個空堆,可容納ca...