堆以及堆排序

2021-08-10 19:10:44 字數 1653 閱讀 6915

(二叉  )堆:乙個類似完全二叉樹的資料結構

左孩子: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實現堆排序

什麼是堆 這裡的堆 二叉堆 指得不是堆疊的那個堆,而是一種資料結構。堆可以視為一棵完全的二叉樹,完全二叉樹的乙個 優秀 的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每乙個結點對應陣列中的乙個元素.陣列與堆之間的關係 二叉堆一般分為兩種 最大堆和最小堆。什麼是最大堆 堆中每個...