如何实现堆排序算法并进行java函数编写?
发布时间:2023-07-06 04:42:10
堆排序是一种基于完全二叉树的排序算法。它的基本思想是将待排序的序列构造成一个大顶堆或小顶堆,然后依次将堆顶元素与最后一个元素交换位置,再对剩余的元素重新构造堆,如此循环直到整个序列有序。
下面是实现堆排序的Java函数编写步骤:
1. 构建大顶堆:首先需要定义一个函数 buildMaxHeap,用于将待排序序列构造成大顶堆。大顶堆的特点是父节点的值大于等于其左右子节点的值。构建大顶堆的思路是从最后一个非叶子节点开始,依次向上调整节点,保证每个节点满足大顶堆的特点。具体实现可以使用递归或迭代的方式。
2. 堆排序:定义一个函数 heapSort,用于实现堆排序算法。首先调用 buildMaxHeap 函数将待排序序列构建成大顶堆。然后通过循环,每次将堆顶元素与最后一个元素交换位置,并调用 buildMaxHeap 函数重新构建大顶堆。循环结束后,整个序列就是有序的。
下面是完整的Java代码实现:
public class HeapSort {
public static void heapSort(int[] array) {
// 构建大顶堆
buildMaxHeap(array);
// 循环将堆顶元素与末尾元素交换位置,然后重新构建大顶堆
for (int i = array.length - 1; i > 0; i--) {
int temp = array[0];
array[0] = array[i];
array[i] = temp;
maxHeapify(array, 0, i);
}
}
private static void buildMaxHeap(int[] array) {
// 从最后一个非叶子节点开始,依次向上调整节点
for (int i = array.length / 2 - 1; i >= 0; i--) {
maxHeapify(array, i, array.length);
}
}
private static void maxHeapify(int[] array, int i, int length) {
int leftChild = 2 * i + 1; // 左子节点的位置
int rightChild = 2 * i + 2; // 右子节点的位置
int largest = i;
// 找到三个节点中最大的节点
if (leftChild < length && array[leftChild] > array[largest]) {
largest = leftChild;
}
if (rightChild < length && array[rightChild] > array[largest]) {
largest = rightChild;
}
// 如果最大节点不是当前节点,则将最大节点与当前节点交换位置,并递归调整交换后的节点
if (largest != i) {
int temp = array[i];
array[i] = array[largest];
array[largest] = temp;
maxHeapify(array, largest, length);
}
}
public static void main(String[] args) {
int[] array = {9, 2, 7, 1, 5, 8, 3, 6, 4};
System.out.println("排序前:");
for (int num : array) {
System.out.print(num + " ");
}
heapSort(array);
System.out.println("
排序后:");
for (int num : array) {
System.out.print(num + " ");
}
}
}
执行上述代码,输出结果如下:
排序前: 9 2 7 1 5 8 3 6 4 排序后: 1 2 3 4 5 6 7 8 9
以上就是实现堆排序算法的Java函数编写。堆排序的时间复杂度为 O(nlogn),是一种高效的排序算法。
