堆排序
在堆排序中,我们首先需要建立一个最大堆(每个最小堆的堆顶元素大于它的子节点),,建立好后在堆顶的元素一定是最大元素,此时我们将这个元素和最后一个元素进行交换,然后重新调整树,让它满足最大堆,以此类推直到交换到第二个元素停止交换。
以下是代码实现:
int n = 14;
int[] arrs = new int[n+1];
private void initArrs() {
arrs[1] = 99;
arrs[2] = 5;
arrs[3] = 36;
arrs[4] = 7;
arrs[5] = 22;
arrs[6] = 17;
arrs[7] = 46;
arrs[8] = 12;
arrs[9] = 2;
arrs[10] = 19;
arrs[11] = 25;
arrs[12] = 28;
arrs[13] = 1;
arrs[14] = 92;
}
private void siftdown(int i) {
int flag = 1;
while(i * 2 <= n && flag == 1) {
flag = 0;
int min = i;
if (arrs[min] < arrs[i * 2]) {
min = i * 2;
flag = 1;
}
if (i * 2 + 1 <= n) {
if (arrs[min] < arrs[i * 2 + 1]) {
min = i * 2 + 1;
flag = 1;
}
}
if (flag == 1) {
swap(i, min);
i = min;
}
}
}
private void swap(int i, int min) {
int temp = arrs[i];
arrs[i] = arrs[min];
arrs[min] = temp;
}
private void createHeap() {
for (int i = n / 2 ; i >= 1; i--) {
siftdown(i);
}
}
private void heapSort() {
while (n > 1) {
swap(1, n--);
siftdown(1);
}
}
@Test
public void testHeapSort() {
initArrs();
createHeap();
heapSort();
for (int i = 1; i <= 14; i++) {
System.out.println(arrs[i]);
}
}