堆排序(Heap Sort)算法及其在Java中的实现
堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法,它的基本思想是将待排序的序列构造成一个大顶堆或小顶堆,然后逐步将根节点与最后一个节点交换并重新调整堆,直到整个序列有序为止。堆排序具有稳定性和高效性的特点,时间复杂度为O(nlogn)。
堆的数据结构
在堆排序算法中,我们通常使用完全二叉树来表示堆,其中父节点的值大于或等于(大顶堆)或小于或等于(小顶堆)其子节点的值。
classDiagram
class Heap {
-int[] heapArray
-int heapSize
+void heapSort(int[] arr)
+void buildHeap()
+void heapify(int i)
+void swap(int i, int j)
}
堆排序算法步骤
- 构建堆:将待排序序列构建成一个大顶堆或小顶堆。
- 调整堆:将根节点与最后一个节点交换,然后重新调整堆使其满足堆的性质。
- 重复2:重复第2步,直到整个序列有序。
Java实现
下面是使用Java语言实现堆排序算法的示例代码:
public class Heap {
private int[] heapArray;
private int heapSize;
public void heapSort(int[] arr) {
heapArray = arr;
heapSize = heapArray.length;
buildHeap();
for (int i = heapSize - 1; i >= 0; i--) {
swap(0, i);
heapSize--;
heapify(0);
}
}
private void buildHeap() {
for (int i = heapSize / 2 - 1; i >= 0; i--) {
heapify(i);
}
}
private void heapify(int i) {
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < heapSize && heapArray[left] > heapArray[largest]) {
largest = left;
}
if (right < heapSize && heapArray[right] > heapArray[largest]) {
largest = right;
}
if (largest != i) {
swap(i, largest);
heapify(largest);
}
}
private void swap(int i, int j) {
int temp = heapArray[i];
heapArray[i] = heapArray[j];
heapArray[j] = temp;
}
}
示例
假设我们有一个待排序的数组:[4, 2, 7, 1, 5, 3]
使用堆排序算法对其进行排序:
public class Main {
public static void main(String[] args) {
int[] arr = {4, 2, 7, 1, 5, 3};
Heap heap = new Heap();
heap.heapSort(arr);
System.out.println("Sorted array:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
输出结果为:1 2 3 4 5 7
总结
堆排序算法是一种高效的排序算法,其时间复杂度为O(nlogn)。通过构建堆并逐步调整堆的过程,我们可以将一个无序序列排序成有序序列。在Java中,我们可以通过实现堆排序算法来实现这一过程。希望本文能帮助你理解堆排序算法及其在Java中的应用。