package xxx;
public class HeapSort {
/**
* 在pos的子树已经是大顶堆的前提下调整以pos为根的二叉树为大顶堆
*/
public void adjustHeap(int[] array, int pos, int length) {
int childPos = 0;
// 持续沿子树方向调整:较大元素上升,较小元素下沉
while ((childPos = 2 * pos + 1) < length) {
// 取两棵子树的树根中较大元素交换
if (childPos + 1 < length) {
if (array[childPos] < array[childPos + 1])
childPos++;
}
// 需要交换:交换后继续沿子树方向调整
if (array[pos] < array[childPos]) {
int tmp = array[pos];
array[pos] = array[childPos];
array[childPos] = tmp;
pos = childPos;
}
// 不需交换:已经是大顶堆,停止沿子树方向调整
else {
break;
}
}
}
/**
* 对array中的元素进行堆排序(递增)
*/
public void heapSort(int[] array) {
// 建初始大顶堆
for (int i = array.length / 2 - 1; i >= 0; i--)
adjustHeap(array, i, array.length);
// N-1趟选择-调整
for (int i = array.length - 1; i > 0; i--) {
int tmp = array[0];
array[0] = array[i];
array[i] = tmp;
adjustHeap(array, 0, i);
}
}
public static void main(String[] args) {
int[] array = new int[16];
java.util.Random random = new java.util.Random();
for (int i = 0; i < array.length; i++)
array[i] = random.nextInt(1000);
System.out.println("排序前:");
for (int i = 0; i < array.length; i++)
System.out.print(array[i] + " ");
System.out.println();
new HeapSort().heapSort(array);
System.out.println("排序后:");
for (int i = 0; i < array.length; i++)
System.out.print(array[i] + " ");
System.out.println();
}
}
堆排序程序
最新推荐文章于 2021-05-20 03:16:38 发布