實現最大堆和堆排序

2021-10-06 15:40:09 字數 1651 閱讀 2297

最大堆:最大堆:堆中某個節點的值總是不大於其父節點的值,可以使用陣列實現:按層,從上到下,從左到有,為節點序號i

往堆中增加元素的操作:往陣列末尾增加,如果比父節點大,則交換,同理,一直到根節點;該操作稱為siftup

去除最大堆根元素的操作:將根元素去除,將最後乙個元素放在根元素的位置,比較根元素左右子節點,如果左右子節點最大值大於根元素,則和最大的子節點交換

所以依次取出最大堆的根元素,對應的就是降序排列

完整**如下:

/**

* 最大堆:堆中某個節點的值總是不大於其父節點的值

* 使用陣列實現:按層,從上到下,從左到有,為節點序號i

* parent(i) = (i-1)/2

* left child(i) = i*2 + 1;

* right child(i) = i*2 + 2;

* @author zhoubw

*/public class maxheap> ;

maxheap.sortdesc(nums);

system.out.println(arrays.tostring(nums));

maxheap.sortasc(nums);

system.out.println(arrays.tostring(nums)); }

private arraylistdata;

public maxheap()

public void add(e e)

public e extractmax()

e ret = data.get(0);

swap(0, data.size()-1);

data.remove(data.size()-1);

siftdown(0);

return ret; }

/*** 降序

* @param array

*/public void sortdesc(e array)

swap(index, parent(index));

index = parent(index);

continue;

} }/**

* index對應的元素比左或者右子節點小,則需要下沉操作

* @param index

*/private void siftdown(int index)

if(data.get(maxindex).compareto(data.get(index)) < 0)

swap(maxindex, index);

index = maxindex;

} }//獲取index的父節點下標

private int parent(int index)

return 0;

} //獲取index的左子節點的下標

private int leftchild(int index)

//獲取index的右子節點的下標

private int rightchild(int index)

private void swap(int i, int j)

}

最大堆實現堆排序

堆排序 這裡使用的是最大堆 思想 1 將當前的堆轉換成最大堆 從最大的非葉子結點開始,1 判斷根結點和左右結點的大小交換相互的位置,使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複 1 操作,直到根結點後再去下乙個非葉子結點,直到根結點 2 轉成最大堆後,每次就將第乙個結點互最後乙個...

最大堆 排序

解除安裝最前面,下面的所有討論都是基於二叉堆 一 什麼是堆 堆是乙個陣列結構,可以看著為一顆完全二叉樹,把這顆完全二叉樹按層從上到下,每層從左至右編序號,每個序號所對應的元素即為陣列中該序號的元素 該樹出最後一層以外每一層都排滿,最後一層從左至右,先左孩子再右孩子排列,如果有父節點沒有排滿孩子 無孩...

最大堆排序

其實堆排序就是對二叉樹的一種操作,使得二叉樹的左右孩子 節點都小於父節點。我使用的是陣列的實現方式,parent i return i 2 i的父節點下標,left i return 2 i i的左子節點 right i return 2 i 1 i的右子節點.以上均為陣列元素的標號位置,在訪問元素...