package com.snnu;
public class HeapSort {
public static void main(String[] args) {
int[] arr = {3, 2, 6, 5, 7, 8};
int len = arr.length;
int[] heap = new int[len];
heap[0] = arr[0];
int t = 1;
//build heap
for (int i = 1; i < len; i++) {
heap[t++] = arr[i];
adjust_up(heap, t - 1);
}
System.out.println("--------------");
for (int i = 0; i < len; i++) {
System.out.println(heap[i]);
}
System.out.println("--------------");
//heap sort
int pos = len - 1;
while (true) {
if (pos == 0){
break;
}
swap(heap, pos, 0);
adjust_down(heap, pos);
pos -= 1;
}
for (int i = 0; i < len; i++) {
System.out.println(heap[i]);
}
}
private static void adjust_down(int[] heap, int pos) {
int start = 0;
int limit = pos;
while (true) {
int left = start * 2 + 1;
int right = start * 2 + 2;
if (left < limit && right < limit) {
if (heap[left] < heap[right]) {
if (heap[right] > heap[start]) {
swap(heap, right, start);
start = right;
continue;
} else {
return;
}
} else {
if (heap[left] > heap[start]) {
swap(heap, left, start);
start = left;
continue;
} else {
return;
}
}
}
if (left < limit && heap[left] > heap[start]) {
swap(heap, left, start);
start = left;
}
if (right < limit && heap[right] > heap[start]) {
swap(heap, right, start);
start = right;
}
return;
}
}
private static void swap(int[] heap, int x, int y) {
int tmp = heap[x];
heap[x] = heap[y];
heap[y] = tmp;
}
private static void adjust_up(int[] heap, int pos) {
int up = pos;
while (true) {
if (pos == 0) { // 如果碰到根节点,就退出
return;
}
up = pos / 2;
if (heap[up] < heap[pos]) {
swap(heap, up, pos);
pos = up;
}else {
return;
}
}
}
}
使用数组实现堆排序
最新推荐文章于 2022-04-28 21:16:41 发布