<span style="font-size:18px;">/**
* 堆排序,基于优先队列的下沉操作
* @author xxxu
*
*/
public class HeapSort {
/*
* 数组a[0]不参加排序,k和数组索引一一对应了
*/
public void sort(int[] a){
int N=a.length-1;
/*
* k=N/2; 2k 和 2k+1 就能顾及到所有的元素
* 在下沉过程中,小的下沉,大的就上浮
* 所以到k=1时,下沉后,根节点就是最大的
*/
for (int k = N/2; k >=1; k--) {
sink(a, k, N);
}
/*
* 根节点最大的,和尾结点交换后,此时尾结点就是最大的,N--,尾结点就不需要动了,以此类推
*/
while(N>1){
exch(a, 1, N--);
sink(a, 1, N);
}
}
// 下沉
private void sink(int[] pq, int k, int N) {
while (2 * k <= N) {
int j = 2 * k;
// 比较左右结点的大小,决定父节点和左结点交换还是有节点交换
if (j < N && less(pq,j, j + 1)) {
j++;
}
if (!less(pq,k, j)) {
break;
}
exch(pq,k, j);
k = j;
}
}
private boolean less(int[] pq,int i, int j) {
if (pq[i] < pq[j]) {
return true;
} else {
return false;
}
}
private void exch(int[] pq,int i, int j) {
int t = pq[i];
pq[i] = pq[j];
pq[j] = t;
}
public void show(int[] a){
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
}</span>
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布