使用java代码实现堆排序
时间: 2023-09-22 08:06:45 浏览: 140
Java实现堆排序
### 回答1:
使用 Java 代码实现堆排序的关键就是实现一个有效的堆数据结构,然后借助该数据结构实现堆排序算法。下面是一个使用 Java 代码实现堆排序的示例: public static void heapSort(int[] array) {
int n = array.length;
// Build a maxheap.
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(array, n, i);
}
// 一个个交换元素
for (int i=n-1; i>=0; i--) {
// Move current root to end
int temp = array[0];
array[0] = array[i];
array[i] = temp;
// call max heapify on the reduced heap
heapify(array, i, 0);
}
}
### 回答2:
堆排序是一种利用二叉堆数据结构进行排序的算法。它通过将待排序的元素构建成一个二叉堆,然后按照特定的规则将最大(最小)元素与堆的最后一个元素进行交换,并逐步缩小堆的范围,直到堆为空,完成排序。
下面是使用Java代码实现堆排序的例子:
```java
public class HeapSort {
public static 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);
}
}
private 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;
}
// 如果最大节点不是根节点,则交换它们,同时递归地调用heapify方法
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 };
sort(arr);
System.out.println("排序后的数组:");
for (int i : arr) {
System.out.print(i + " ");
}
}
}
```
以上是一个使用Java代码实现堆排序的例子,通过构建最大堆和交换根节点来实现排序。运行上述示例代码会输出排序后的数组 [5, 6, 7, 11, 12, 13]。
### 回答3:
堆排序是一种基于完全二叉堆的排序算法。完全二叉堆是一种特殊的二叉树,满足以下性质:对于任意节点i,其左子节点的下标为2i,右子节点的下标为2i+1。同时,堆中每个节点的值都大于或等于其子节点的值,这被称为大顶堆;或者每个节点的值都小于或等于其子节点的值,这被称为小顶堆。
下面是使用Java代码实现堆排序:
```java
import java.util.Arrays;
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);
}
}
// 调整堆
private 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 = { 4, 10, 3, 5, 1 };
HeapSort heapSort = new HeapSort();
heapSort.heapSort(arr);
System.out.println(Arrays.toString(arr)); // 输出:[1, 3, 4, 5, 10]
}
}
```
以上代码首先构建堆,然后通过不断将堆的根节点与未排序区间的最后一个元素交换,并对交换后的堆进行调整,最终实现排序。以上示例中的输入数组为{4, 10, 3, 5, 1},经过堆排序后,输出的排序结果为[1, 3, 4, 5, 10]。
阅读全文