(二叉 )堆:乙個類似完全二叉樹的資料結構
左孩子:2i
右孩子:2i+1
父節點:i/2
(以上結論如果記不住,用到時可以自己畫個圖推一下)
物理儲存:用陣列儲存a(1,2,3....,n)
1.調整每個節點的演算法:
如果要建立大頂堆,則需遵循每個父親結點的值都要大於左右孩子的值
遞迴版本:
/**
* * @param numbers
* 待調整陣列
* @param i
* 待調整節點
* @param len堆的大小
*/public static void maxheapify(int numbers, int i, int len)
if (r < len && numbers[largest] < numbers[r])
if (largest != i)
}
非遞迴版本:
public static void maxheapify1(int numbers, int i, int len)
if (r < len && numbers[largest] < numbers[r])
//修改遞迴呼叫
while (largest != i)
if (r < len && numbers[largest] < numbers[r])
} }
2.建立堆的演算法:
自底向上建立,調整每個非葉子節點,葉子節點無需再調整
利用結論,完全二叉樹中(n/2+1,...,n)為葉子節點
public static void buildmaxheap(int numbers)
}
3.堆排序的演算法:
建立乙個大頂堆,第乙個元素與最後乙個元素交換
縮小堆的規模,此時只有第乙個節點可能不符合堆的性質,對第乙個節點呼叫調整節點的演算法
重複1,2步驟直到堆的規模縮小為1
// 堆排序演算法,按從小到大排的
// 初始建立乙個大頂堆,因為陣列中的最大元素總在根節點a[0]中,通過把它與a[n]進行互換,可以把它放在正確的位置
// 這時從陣列中去除第n個節點,這時只有根節點可能是違背最大堆的性質,這時呼叫一次堆調整方法就可以了,此時堆的規模減少了1
public static void heapsort(int numbers)
}
4.優先佇列:(最大優先佇列、最小優先佇列)
insert(s,x):插入乙個元素
maxnum(s):返回集合中最大的元素
extract-max(s):返回並從集合中刪除最大的元素
increase-key(s,x,k):將元素x的關鍵字增加到k
應用:計算機系統的作業排程(上os時有個優先順序排程演算法)
完整**:
堆以及堆排序實現
1.今天實現了一下堆排序,這裡的堆是指二叉堆,至於二項堆和斐波那契堆以後再說。先看二叉堆的定義 二叉堆是完全二叉樹或近似完全二叉樹。滿足特性是 父親節點的值大於等於 小於等於 左右孩子的值,並且左右子樹也是二叉堆。對應的二叉堆是大頂堆 小頂堆 二叉堆是完全二叉樹,可以用線性表來儲存。2.實現堆排序時...
堆以及堆排序詳解
記錄一下自己理解的堆和堆排序吧。堆是一種類似於完全二叉樹的樹形結構,對於二叉樹中所有非葉子節點,如果根節點的值嚴格大於其兩個兒子的值,則稱為 大頂堆,反之稱為小頂堆。堆排序的一般步驟 首先利用已有的資料構造乙個堆,大頂堆增序,小頂堆降序。將堆頂的元素與堆末元素交換,接著重新調整剩下的元素為乙個堆,直...
堆以及php實現堆排序
什麼是堆 這裡的堆 二叉堆 指得不是堆疊的那個堆,而是一種資料結構。堆可以視為一棵完全的二叉樹,完全二叉樹的乙個 優秀 的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每乙個結點對應陣列中的乙個元素.陣列與堆之間的關係 二叉堆一般分為兩種 最大堆和最小堆。什麼是最大堆 堆中每個...