Java函数实现堆排序算法的例子
在计算机科学中,堆排序是一种排序算法,它利用堆的数据结构来进行排序。堆是一个特殊的数据结构,它可以用一棵完全二叉树来表示。
堆有两种形式,最大堆和最小堆。在最大堆中,父节点比它的子节点大;在最小堆中,父节点比它的子节点小。因为根据堆的定义,堆顶一定是最大值或最小值,所以在堆排序中,我们将数据按照从小到大的顺序排列,使用最大堆。
堆排序算法步骤如下:
1.建立最大堆:从最后一个非叶子节点开始进行调整,将其和下面最大的子节点交换位置。然后递归调整之前的位置,使其满足最大堆的性质。
2.排序:将堆顶元素与最后一个元素交换位置,然后再次进行最大堆调整。
3.重复步骤2,直到所有元素排好序。
Java实现堆排序算法
以下是Java实现堆排序算法的例子。
import java.util.Arrays;
public class HeapSort {
public void sort(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; // 左子节点
int r = 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 static void main(String args[]) {
int arr[] = {12, 11, 13, 5, 6, 7};
System.out.println("排序前:");
System.out.println(Arrays.toString(arr));
HeapSort ob = new HeapSort();
ob.sort(arr);
System.out.println("排序后:");
System.out.println(Arrays.toString(arr));
}
}
输出:
排序前:
[12, 11, 13, 5, 6, 7]
排序后:
[5, 6, 7, 11, 12, 13]
以上就是Java实现堆排序算法的例子,通过代码的实现我们可以更加深入地理解堆排序算法的流程和实现。
