一、堆的特性:堆是一种特殊的树形数据结构,即完全二叉树。堆分为大顶堆和小顶堆。
大顶堆:每个节点的值都大于或等于其两个子节点的值,在堆排序算法中用于升序排序。
小顶堆:每个节点的值都小于或等于其两个子节点的值,在堆排序算法中用于降序排序。
二、堆排序步骤:
1.构造一个大顶堆(或小顶堆),取堆顶数字(也就是最大值或最小值)
2.再将剩下的数字构建一个大顶堆(或小顶堆),取堆顶数字(也就是剩下值当中的最大值(或最小值))
3.重复以上操作,直到取完堆中的数字,最后得到一个从大到小(或从小到大)排序的序列
基本思路:
将所有元素构成一个堆的形式,然后比较每一个二叉树,将最大的或最小的与根节点元素互换位置,最后将最顶根节点取出,再从左到右、从下到上的方式将尾节点放到最顶根节点上,再重复上述操作进行排序取出最大或最小元素,以此类推,直到所有元素取出。
平均时间复杂度:O()
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) throws Exception {
int[] arr = {3, 45, 78, 99, 45, 11, 64, 55, 52, 11, 18, 66, 17, 37, 199, 120, 54, 49};
System.out.println("未排序的数组:" + Arrays.toString(arr));
sort(arr);
System.out.println("排序的数组:" + Arrays.toString(arr));
}
public static int[] sort(int[] arr) throws Exception {
// 对 arr 进行拷贝,不改变参数内容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
int len = arr.length;
buildMaxHeap(arr, len);
for (int i = len - 1; i > 0; i--) {
swap(arr, 0, i);
len--;
heapify(arr, 0, len);
}
return arr;
}
private static void buildMaxHeap(int[] arr, int len) {
for (int i = (int) Math.floor(len / 2); i >= 0; i--) {
heapify(arr, i, len);
}
}
private static void heapify(int[] arr, int i, int len) {
int left = 2 * i + 1;
int right = 2 * i + 2;
int largest = i;
if (left < len && arr[left] > arr[largest]) {largest = left;
}
if (right < len && arr[right] > arr[largest]) {
largest = right;
}
if (largest != i) {
swap(arr, i, largest);
heapify(arr, largest, len);
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
---end---
扫描下方二维码
添加好友,备注【交流】
可私聊相互学习,共同进步,资源共享



