寫在之前
1.自定義實現採用陣列作為內部資料結構
2.內部陣列通過grow方法進行擴容,每次只是簡單的擴充套件為原來的2倍
3.集中實現方式的主要區別在於siftdown方法
實現方式一(遞迴實現)
關鍵**:
@override
protected void siftdown(int index)
int currentmin = left;
if(right <= len && arr[currentmin] > arr[right])
if(arr[currentmin] < arr[index])
}
實現方式二(迴圈實現)
關鍵**:
@override
protected void siftdown(int index)
int currentmin = left;
if(right <= len && arr[currentmin] > arr[right])
if(arr[currentmin] >= arr[index])
swap(arr, currentmin, index);
index = currentmin;
}}
實現方式三(直接構建堆)
關鍵**:
@override
protected void siftdown(int index)
int currentmin = left;
if(right <= len && arr[currentmin] > arr[right])
if(arr[currentmin] < arr[index])
//進入下乙個非葉子節點
index++;
}}
實現方式四(jdk中的實現)
1.siftup方法:
protected void siftup(int k, int x)
arr[k] = x;
}
2.siftdown方法:
/**
* 指定index位置的值為x,並為x在堆中找到合適位置
* @param index
* @param x
*/private void siftdown(int index, int x)
//將最終值放入合適位置
arr[index] = x;
}
其他的一下關鍵方法
1.siftup方法:
@override
protected void siftup(int index)
}
2.add方法:
@override
public boolean add(int ele)
int i = totalcount;
arr[i] = ele;
if(totalcount == 1)
//調整元素位置確保為小根堆
siftup(i);
totalcount++;
return true;
}
3.poll方法:
@override
public int poll()
5.remove方法:
@override
public int remove(int ele)
//計算元素位置
int index = indexof(ele);
if(index < 0)
return removeat(index);
}
6.removeat方法:
@override
protected int removeat(int idx)
int result = arr[idx];
//將刪除元素與最後乙個元素交換位置
if(idx != totalcount -1)
//位置交換之後佇列長度減一
totalcount--;
//如果佇列長度大於1,而且刪除的元素位置不在隊尾則重新調整堆
if(totalcount > 1 && idx != totalcount)
return result;
}
優先順序佇列 大根堆和小根堆
概述 與fifo的普通佇列不同,在優先順序佇列中,元素出隊順序是由元素的優先順序決定。比如大根堆是最大的元素先出隊,小根堆是最小的元素先出隊。堆是實現優先順序佇列效率很高的資料結構 當然我們也可以使用無序的線性表或者有序鍊錶來實現,但是它們的刪除 插入的時間複雜度至少有乙個是o n 堆是一棵完全二叉...
優先順序佇列(堆實現)
一 優先順序佇列定義 二 方法實現 獲得最大元素方法 去掉最大元素方法 修改優先順序方法 新增節點 三 實現 用堆實現乙個優先順序佇列 主要是新增 修改 刪除節點 節點具有唯一性 author hhf 2014年11月28日 public class priorityqueue 返回優先佇列中優先順...
優先順序佇列(堆實現)
優先順序佇列 概念 一般來說我們會根據事情的重要程度優先處理某事,比如完成學習任務和刷微博,我們會認為完成學習任務比較重要,因此會先執行它,因此在這種情況下,資料結構就應提供兩個基本的操作,一是返回最高優先順序物件,二是新增新的物件,這種資料結構就叫做優先順序佇列。二叉樹的順序儲存 儲存方式 使用陣...