目录
1.基本思想
堆排序(Heap Sort)的基本思想是利用堆这种数据结构进行排序。堆是一个完全二叉树,分为最大堆(Max Heap)和最小堆(Min Heap)两种类型。
- 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
- 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
2.堆排序的步骤
堆排序的基本步骤:
-
建堆(Heapify):
- 将待排序数组看作是一个完全二叉树,并构建一个最大堆(Max Heap)或最小堆(Min Heap)。
- 从最后一个非叶子节点开始,依次向前调整节点,使得每个节点都满足堆的性质(父节点的值大于/小于子节点的值)。
-
排序:
- 从堆顶(根节点)取出最大(最小)元素,与堆的最后一个元素交换位置。
- 然后对剩余的堆进行调整,使其重新满足堆的性质。
- 不断重复上述步骤,直到整个数组有序。
3.堆排序算法的实现
Java 实现堆排序的示例代码:
public class HeapSort {
public static void heapSort(int[] arr) {
int n = arr.length;
// Build heap (rearrange array)
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
// One by one extract an element from heap
for (int i = n - 1; i > 0; i--) {
// Move current root to end
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
// call max heapify on the reduced heap
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 temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
heapify(arr, n, largest);
}
}
public static void main(String[] args) {
int[] arr = {12, 11, 13, 5, 6, 7};
System.out.println("Original Array: " + Arrays.toString(arr));
heapSort(arr);
System.out.println("Sorted Array: " + Arrays.toString(arr));
}
}
在上面的示例中,heapSort
方法用于执行堆排序,heapify
方法用于维护堆的性质。
4.堆排序的特点:
- 时间复杂度: 堆排序的时间复杂度为 O(n*log(n)),其中 n 是数组的长度。这是因为建堆的时间复杂度为 O(n),每次调整堆的时间复杂度为 O(log(n)),共需要调整 n-1 次。
- 空间复杂度: 堆排序是原地排序算法,只需要常数级别的额外空间。
- 稳定性: 堆排序是一种不稳定的排序算法,因为在调整堆的过程中可能会改变相同元素的顺序
5.总结
堆排序是一种高效的排序算法,尤其适用于需要稳定时间复杂度的情况下。它不需要额外的空间,是原地排序算法,适用于大规模数据的排序。