文章摘要: 堆排序是一种基于比较的排序算法,利用堆这种数据结构进行排序。
简介
简要说明
- 堆排序是一种基于比较的排序算法,利用堆这种数据结构进行排序。
- 堆是一种近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。
主要功能
- 对一组数据进行排序,使得数据按照升序或降序排列。
- 通过构建最大堆或最小堆,将最大(或最小)元素移动到数组的起始位置,然后与最后一个元素交换,逐步缩小堆的大小,最终得到排序数组。
注意事项
- 堆排序不是稳定的排序算法,因为它会改变相等元素的相对顺序。
- 在实现堆排序时,需要注意维护堆的性质。
适用场景
- 适用于数据量较大的情况。
- 适用于需要非稳定排序的场景。
- 适用于对时间复杂度有较高要求的场景。
时间复杂度
- 最坏情况:O(n log n),因为每次调整堆的时间复杂度是O(log n),需要调整n次。
- 平均情况:O(n log n)。
- 最好情况:O(n log n)。
空间复杂度
- O(1),堆排序是在原地进行的,不需要额外的存储空间。
Java 8
public class HeapSortExample {
public static void main(String[] args) {
int[] array = {12, 11, 13, 5, 6, 7};
heapSort(array); // 对数组进行堆排序
printArray(array); // 打印排序后的数组
}
// 堆排序方法
public static void heapSort(int[] arr) {
int n = arr.length;
// 构建最大堆
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
// 一个个从堆顶取出元素
for (int i = n - 1; i >= 0; i--) {
// 当前根元素与最后一个元素交换
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
// 调整剩余堆
heapify(arr, i, 0);
}
}
// 调整堆的方法
public static void heapify(int[] arr, int n, int i) {
int largest = i; // 初始化最大元素索引为根节点
int left = 2 * i + 1; // 左子节点
int right = 2 * i + 2; // 右子节点
// 如果左子节点大于根节点
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
// 如果右子节点比最大元素还大
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
// 如果最大元素不是根节点
if (largest != i) {
int swap = arr[i];
arr[i] = arr[largest];
arr[largest] = swap;
// 递归地调整受影响的子堆
heapify(arr, n, largest);
}
}
// 打印数组方法
public static void printArray(int[] arr) {
for (int value : arr) {
System.out.print(value + " "); // 打印数组元素,后面跟一个空格
}
System.out.println(); // 打印完数组后换行
}
}
注释
在这个Java案例中,heapSort方法实现了堆排序算法。首先通过heapify方法构建最大堆,然后将堆顶元素(最大值)与最后一个元素交换,并重新调整剩余元素构成的堆,重复这个过程直到堆的大小为1。printArray方法用于打印排序后的数组。