堆排序是一种高效的排序算法,它利用了堆的数据结构来实现。堆是一种特殊的完全二叉树,分为最大堆和最小堆两种类型。在最大堆中,父节点的值大于等于其子节点的值;而在最小堆中,父节点的值小于等于其子节点的值。
堆排序的基本思想是:
- 将待排序的序列构造成一个大顶堆(或小顶堆)。
- 此时,整个序列的最大值(或最小值)就是堆顶的根节点。
- 将堆顶元素与末尾元素进行交换,使末尾元素最大(或最小)。
- 然后对剩余的 n-1 个元素重新构造堆,得到 n-1 个元素的最大(或最小)值。
- 如此反复执行,直到整个序列有序。
代码实现:
java
public class HeapSort {
public 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);
}
}
void heapify(int[] arr, int n, int i) {
int largest = i;
int l = 2 * i + 1; // left = 2*i + 1
int r = 2 * i + 2; // right = 2*i + 2
if (l < n && arr[l] > arr[largest])
largest = l;
if (r < n && arr[r] > arr[largest])
largest = r;
if (largest != i) {
int swap = arr[i];
arr[i] = arr[largest];
arr[largest] = swap;
heapify(arr, n, largest);
}
}
public void printArray(int[] arr) {
int n = arr.length;
for (int i = 0; i < n; ++i)
System.out.print(arr[i] + " ");
}
public static void main(String[] args) {
int[] arr = {12, 11, 13, 5, 6, 7};
int n = arr.length;
HeapSort heapSort = new HeapSort();
heapSort.heapSort(arr);
heapSort.printArray(arr);
}
}