堆排序(java實現)

2021-08-15 13:32:04 字數 1804 閱讀 4097

堆是乙個陣列,它可以看成近似的完全二叉樹。表示堆的陣列包括兩個屬性:a.length陣列元素的個數,a.heapsize表示多少個元素存在陣列中。這裡的關係是:

0<= a.heapsize<=a.length
由於陣列沒有heapsize,因此這裡自己需要自己處理一下。

public

class

heapsort ;

int heapsize = a.length - 1;

hs.build_max_heap(a);

hs.heapsort(a);

hs.heapextractmax(a, heapsize);

hs.print(a);

}/**

* 取出最大值

*/public

intheapmaximum(int a)

/*** 取出最大元素的值,並從陣列中取出

*/public

intheapextractmax(int a, int heapsize)

int max = a[1];

a[1] = a[heapsize];

heapsize = heapsize - 1;

max_heapify(a, 1, heapsize);

return max;

}/**

* 增加某個結點的值

*/public

void

heapincreasekey(int a, int i, int key)

a[i] = key;

while (i > 1 && a[parent(i)] < a[i])

}/**

* 插入元素

*/public

void

maxheapinsert(int a, int key, int heapsize)

/*** 堆排序

*/public

void

heapsort(int a)

print(a);

}/**

* 建立最大堆

*/public

void

build_max_heap(int a)

}/**

* 對於樹高度為h來說,時間複雜度為o(h)

*/public

void

max_heapify(int a, int i, int heap_size) else

if (r <= heap_size && a[r] > a[largest])

if (largest != i)

}/**

* 父結點

*/public

intparent(int i)

/*** 左孩子

*/public

intleft(int i)

/*** 右孩子

*/public

intright(int i)

/*** 交換陣列中兩個元素的值

*/public

void

swap(int a, int x, int y) catch (exception e)

}/**

* 列印

*/public

void

print(int a)

}}

堆排序總體上還是很簡單的,演算法導論上已經寫的很是清楚明白了。這本書大三時候買的,當時沒怎麼看,現在重新看,經典終究是經典啊,希望堅持看完。內功加強中ing~~~~~

參考:演算法導論

java實現堆排序

許多應用要用堆,比如,優先佇列,即佇列的擴充,佇列的每個元素增加乙個稱為優先順序的字段,優先佇列可以是線性結構的,但要有較高的效率,應把它組織成堆結構。元素入隊是,相當於執行堆的插入演算法 但在隊頭每次刪除的總是隊頂具有最大優先順序的元素,因此可以把它稱為最大優先順序佇列。再比如,堆排序是選擇排序中...

堆排序java實現

公升序用大根堆,降序用小根堆 調整堆 從根節點開始向下調整堆 先建立初始堆,從n 2 1 第乙個非葉子節點 節點開始,將之看做根節點,向下調整堆,到根節點結束 迴圈i from n 1 to 0,每次取出堆的最頂層根節點,即陣列下標為0,然後與節點i交換,這樣對於大根堆而言,最大值總是在後面,再從根...

Java 實現堆排序

堆排序主要是利用堆在根節點上的特性,既在大頂堆的情況下,堆的第乙個元素是堆當中最大的元素,而在小頂堆的情況下,堆的第乙個元素是最小的節點。所以在堆排序的過程,主要的操作就是對每次取出堆頂的元素之後 在這裡使用大頂堆 我們就選出了堆中的最大元素,然後對堆剩下的元素進行再次進行大頂堆的調正,得到乙個新的...