import java.util.Scanner;
public class Heap {
private int[] data;
/*输入数组元素,数组下标从1开始*/
public void input() {
System.out.println("请输入数组大小");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
data = new int[n + 1];
System.out.println("输入数组元素");
for (int i = 1; i <= data.length-1; i++) {
data[i] = scanner.nextInt();
}
System.out.println("输入完成");
}
//测试数据:
//第一组:1 7 9 3 10 16 4 14 2 8
//第二组:17 8 84 2 45 94
//第三组:10 32 1 9 5 7 12 0 4
public static void main(String args[]){
Heap h=new Heap();
h.input();
System.out.println("堆排序前:");
h.print();
h.heapSort();
System.out.println("堆排序后:");
h.print();
}
/**
* 调整堆,使其满足堆得定义
* @param i
* @param n
*/
public void adjust(int i, int n) {
int child;
for (; i <= n / 2; ) {
child = i * 2;
// System.out.println("child="+child);
if(child+1<=n&&data[child]<data[child+1])
child+=1;/*使child指向值较大的孩子*/
if(data[i]<data[child]){
swap(i, child);
/*交换后,以child为根的子树不一定满足堆定义,所以从child处开始调整*/
i = child;
} else break;
}
}
public void heapSort() {
/*根据树的性质建堆,树节点前一半一定是分支节点,所以我们从这里开始调整出初始堆*/
for (int i = data.length / 2; i > 0; i--)
adjust(i, data.length-1);
System.out.println("调整后的初始堆:");
print();
for (int i = data.length-1; i > 0; i--) {
/*把根节点跟最后一个元素交换位置,调整剩下的n-1个节点,即可排好序*/
swap(1, i);
adjust(1, i - 1);
}
}
public void swap(int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
public void print() {
for (int i = 1; i < data.length; i++) {
System.out.print(data[i]+" ");
}
System.out.println();
}
}
运行:
请输入数组大小
10
输入数组元素
1 7 9 3 10 16 4 14 2 8
输入完成
堆排序前:
1 7 9 3 10 16 4 14 2 8
调整后的初始堆:
16 14 9 7 10 1 4 3 2 8
堆排序后:
1 2 3 4 7 8 9 10 14 16
下载源码:
- 大小: 30 KB
- 大小: 23.6 KB
- 大小: 71.7 KB
- 大小: 14.8 KB
分享到:
相关推荐
在实际应用中,Java的`PriorityQueue`可以提供更简洁的实现方式,但手动实现有助于理解堆排序的工作原理。 总结起来,堆排序是一种高效的排序算法,时间复杂度为O(n log n),空间复杂度为O(1)。在Java中,我们可以...
堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在Java中,我们可以利用数组来表示堆,因为数组...结合博客的详细解释,读者可以更深入地理解堆排序的工作机制,并通过实践代码加深印象。
该资源包括实用练习,让读者可以练习在Java中实现堆排序,并提供解决方案以帮助读者检查自己的工作并深入理解所学内容。 无论您是Java编程的初学者还是有经验的程序员,该资源都将为您提供有价值的指导和支持,帮助...
### 堆排序原理与实现 #### 一、堆排序简介 堆排序是一种基于比较的排序算法,利用了堆的数据结构。它将待排序数组构造成一个大顶堆(或小顶堆...通过上述代码实现,可以有效地理解和掌握堆排序的工作原理及实现细节。
#### 堆排序代码分析 提供的代码中定义了一个名为`HeapSort`的类,该类包含了主要的堆排序逻辑。`Sort`方法实现了堆排序的整体流程,`Adjust`方法负责维护最大堆的性质,`Display`方法用于输出数组状态。 #### 其他...
本文将深入探讨在JAVA中实现的各种排序算法,包括堆排序、归并排序、快速排序、基数排序、选择排序、冒泡排序、插入排序、希尔排序、计数排序和桶排序。 1. **堆排序**:堆排序是一种基于比较的排序算法,它利用了...
本篇将详细介绍标题所提及的四种排序算法:Shell排序、快速排序、归并排序以及堆排序。 1. **Shell排序**: Shell排序是一种改进的插入排序,由Donald Shell于1959年提出。它通过设置一个间隔序列,使得数组中的...
选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出...在实际编程中,我们通常会使用更高效的排序算法,如快速排序、归并排序或堆排序,但理解基础排序算法对提升编程技能仍然非常重要。
在Java中,我们可以使用以下步骤来实现堆排序: 1. **理解堆的概念**:堆是一个近似完全二叉树的结构,同时满足堆的性质,即每个节点的值都大于或等于其子节点的值(称为大顶堆,用于升序排列),或者小于或等于其...
Java的PriorityQueue类可以用来实现堆排序的一部分功能。 7. 计数排序(Counting Sort)、桶排序(Bucket Sort)和基数排序(Radix Sort): 这些排序算法适用于特定类型的数据,例如非负整数。计数排序统计每个...
在编程领域,排序算法是数据结构与算法学习中的基础且重要的部分。Java作为一种广泛应用的编程语言,其在...在学习过程中,通过阅读和实践提供的Java代码,可以更直观地理解每种排序算法的工作原理及其在Java中的实现。
通过这个文件,你可以学习到如何将理论上的堆排序算法转化为实际的Java代码,并理解每一步是如何工作的。 总的来说,堆排序算法具有O(n log n)的时间复杂度,对于大数据集来说是相当高效的。同时,由于其原地排序的...
以下将详细讲解标题“各种排序Java代码”中涉及的几种排序方法,包括快速排序、冒泡排序、堆排序和归并排序。 1. **快速排序(Quick Sort)**: 快速排序是一种基于分治思想的高效排序算法,由C.A.R. Hoare在1960...
本资源包含的是Java实现的各种常见排序算法的代码示例,每个算法都有详细的注释,方便初学者理解和学习。 1. **冒泡排序**:这是一种基础的排序算法,通过不断交换相邻的逆序元素来逐渐把较大的元素推向数组的后部...
了解和掌握这些排序算法的原理和实现方式,不仅有助于编写高效的排序代码,还能帮助我们在面对实际问题时选择最合适的解决方案。在学习过程中,可以结合实际例子,通过编写代码来加深理解,同时通过分析时间复杂度和...
在编程领域,排序算法是数据结构与算法学习中的基础部分,它们用于整理无序的数据序列。以下是关于Java实现的七种排序算法的详细...在Java编程中,理解这些排序算法的实现和性能特点,有助于写出高效、适应性强的代码。
在Java中实现堆排序,我们需要理解堆的数据结构以及如何维护堆的性质。接下来,我们将深入探讨这个话题。 堆是一个近似完全二叉树的结构,并且满足堆的性质:即父节点的值总是大于或等于(最大堆)或小于或等于...
5. **Heap Sort(堆排序)**:堆排序利用了二叉堆的数据结构,将待排序序列构造成一个大顶堆或小顶堆,然后通过交换堆顶元素与末尾元素实现排序。Java中的Heap Sort适用于处理大数据量,且时间复杂度为O(n log n)。 ...
总的来说,堆排序算法通过构建和调整堆来达到排序的效果,而Java中的面向对象思想则有助于我们更好地组织和理解代码。然而,在实际应用中,我们需要根据性能需求来选择最合适的实现策略。在这个案例中,提供的面向...