Java實現堆排序

2021-09-11 17:54:12 字數 2591 閱讀 2510

使用陣列儲存二叉堆的資料,陣列中樹的層級關係為:

1)下標為i的節點的父節點的下標是(i - 1) / 2

2)下標為i的節點的左子節點的下標是:2 * i + 1,右子節點是:2 * i + 2。

步驟1:新建乙個陣列

步驟2:使用這個數組建堆(自底向上下沉堆化)

步驟3:堆排序(迴圈替換末尾節點和root並下沉堆化root)

package heap;

/** * 大頂堆,用陣列實現

*/public class maxheap

/*** 數組建堆

* @param arr

*/public void buildmaxheap(int arr)

this.count = arr.length;

for (int i = 0; i < arr.length; i++)

// 從第乙個非葉子節點位置開始下沉堆化

for (int i = (this.count - 1) / 2; i >= 0; i--)

}/**

* 堆排序

* @return

*/public int heapsort()

for (int i = 0; i < oldcount; i++)

this.count = oldcount;

return sortedarr;

}/**

* 父節點在陣列中的位置

* @param i

* @return

*/public int parentidx(int i)

return (i - 1) / 2;

}/**

* 左子節點在陣列中的位置

* @return

*/private int leftchildidx(int i)

return left;

}/**

* 右子節點在陣列中的位置

* @param i

* @return

*/private int rightchildidx(int i)

return right;

}/**

* 從節點i開始下沉堆化

* @param i

*/private void downforward(int i)

int left = this.leftchildidx(i);

int right = this.rightchildidx(i);

// 比較節點i與左、右子節點

int maxidx = this.maxidx(i, left, right);

if (maxidx == -1 || maxidx == i)

// 下沉

this.exch(i, maxidx);

// 繼續下沉

downforward(maxidx);

}private int maxidx(int i, int left, int right)

int max = i;

if (left != -1)

}if (right != -1)

}return max;

}private void exch(int i, int j)

/*** 雙倍擴容

*/private void resize()

this.capacity = capacity * 2;

}public int size()

/*** 分層列印

*/public void printheapbylayer()

system.out.println(this.array[history + printsize - 1]);

history += printsize;

h++;}}

}

測試:

package heap;

import com.alibaba.fastjson.json;

public class test ;

// 數組建堆

maxheap maxheap = new maxheap(10);

maxheap.buildmaxheap(arr);

system.out.println("數組建堆結果:");

maxheap.printheapbylayer();

// 堆排序

int sortedarr = maxheap.heapsort();

system.out.println();

system.out.println("堆排序結果:");

system.out.println(json.tojson(sortedarr));

}}

最終列印:

數組建堆結果:

layer_0: 31

layer_1: 10,21

layer_2: 5,8,12,18

layer_3: 3,2,1,7

堆排序結果:

[1,2,3,5,7,8,10,12,18,21,31]

java實現堆排序

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

堆排序java實現

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

Java 實現堆排序

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