Java 堆排序代码
时间: 2023-08-19 22:14:59 浏览: 71
### 回答1:
Java 中的堆排序是一种比较快速的排序算法,它的时间复杂度为 O(nlogn),其中 n 是要排序的数组的长度。它的基本思想是:将数组中的元素构建成一个大根堆,然后依次将堆顶元素(也就是最大的元素)与末尾元素交换,再重新构建大根堆,以此类推,直到整个数组有序。
以下是 Java 中的堆排序代码:
```
public void heapSort(int[] arr) {
// 构建大根堆
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjustHeap(arr, i, arr.length);
}
// 堆排序
for (int j = arr.length - 1; j > 0; j--) {
// 将堆顶元素与末尾元素交换
swap(arr, 0, j);
// 重新调整为大根堆
adjustHeap(arr, 0, j);
}
}
/**
* 调整大根堆
*/
public void adjustHeap(int[] arr, int i, int len) {
// 将当前节点的值保存到临时变量中
int temp = arr[i];
// k 指向当前节点的左子节点
for (int k = i * 2 + 1; k < len; k = k * 2 + 1) {
// 如果当前节点的右子节点存在,并且大于左子节点,则指向右子节点
if (k + 1 < len && arr[k] < arr[k + 1]) {
k++;
}
// 如果子节点大于父节点,则交换
if (arr[k] > temp) {
arr[i] = arr[k];
i = k;
}
### 回答2:
堆排序(Heap Sort)是一种通过构建最大堆或最小堆来实现的排序算法,它的平均时间复杂度为O(nlogn)。
下面是Java语言实现堆排序的代码:
```
public class HeapSort {
public static 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);
}
}
// 调整以root为根节点的子树成为最大堆
public static void heapify(int arr[], int size, int root) {
int largest = root; // 初始化最大元素为根节点
int left = 2 * root + 1; // 左子节点的索引
int right = 2 * root + 2; // 右子节点的索引
// 如果左子节点大于根节点,将最大元素索引更新为左子节点
if (left < size && arr[left] > arr[largest]) {
largest = left;
}
// 如果右子节点大于根节点,将最大元素索引更新为右子节点
if (right < size && arr[right] > arr[largest]) {
largest = right;
}
// 如果最大元素不是根节点,则交换根节点和最大元素,并继续调整子树
if (largest != root) {
int temp = arr[root];
arr[root] = arr[largest];
arr[largest] = temp;
heapify(arr, size, largest);
}
}
public static void main(String args[]) {
int arr[] = {56, 23, 12, 78, 45, 10, 45};
heapSort(arr);
System.out.println("排序后的数组:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
```
以上代码定义了一个`HeapSort`类,其中包含了一个`heapSort`方法和一个`heapify`方法。`heapSort`方法用于执行堆排序算法,而`heapify`方法用于调整以某个节点为根节点的子树,使其成为最大堆。
在`heapSort`方法中,首先从最后一个非叶子节点开始构建最大堆。然后,依次将最大的元素与数组末尾交换,并重新构建最大堆。最后,输出排序后的数组。
在`main`方法中,我们定义了一个待排序的数组,并调用`heapSort`方法对其进行排序。最后,输出排序后的数组。
以上是Java中实现堆排序的代码。
### 回答3:
Java 堆排序是一种使用堆数据结构进行排序的算法。下面是一个简单的Java实现:
```java
import java.util.Arrays;
public class HeapSort {
public static void heapSort(int[] array) {
int n = array.length;
// 构建最大堆
for (int i = n / 2 - 1; i >= 0; i--)
heapify(array, n, i);
// 从堆顶开始不断将最大元素移至数组末尾
for (int i = n - 1; i >= 0; i--) {
// 交换堆顶元素与当前末尾元素
int temp = array[0];
array[0] = array[i];
array[i] = temp;
// 对剩余元素重新构建最大堆
heapify(array, i, 0);
}
}
// 将数组中的元素构建为最大堆
public static void heapify(int[] array, int n, int i) {
int largest = i; // 初始化堆顶元素为最大值
int left = 2 * i + 1; // 左子节点的索引位置
int right = 2 * i + 2; // 右子节点的索引位置
// 如果左子节点大于根节点,将largest设置为左子节点
if (left < n && array[left] > array[largest])
largest = left;
// 如果右子节点大于当前最大值,将largest设置为右子节点
if (right < n && array[right] > array[largest])
largest = right;
// 如果largest不是根节点,将largest与根节点交换,并继续构建最大堆
if (largest != i) {
int swap = array[i];
array[i] = array[largest];
array[largest] = swap;
heapify(array, n, largest);
}
}
public static void main(String[] args) {
int[] array = {10, 7, 8, 9, 1, 5};
heapSort(array);
System.out.println(Arrays.toString(array));
}
}
```
上述代码实现了堆排序。首先,它使用构建最大堆的函数 `heapify` 将输入数组构建为最大堆。然后,在每次循环中,将堆顶元素(即最大值)与当前数组末尾元素交换,然后对剩余元素重新构建最大堆。通过这样的迭代过程,最终得到一个有序的数组。
在主函数中,我创建了一个测试数组并调用堆排序函数 `heapSort`。最后,通过使用 `Arrays.toString()` 函数将排序结果打印出来。