//author:lilywangcn
public class HeapSort {
private static int[] array=new int[]{10,30,20,4,9,-1,10,6,15};
/**
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
print();
buildsort();
print();
}
public static void buildHeap(){
for(int i=array.length/2-1; i>=0; i--){
heapify(i,array.length-1);
}
}
private static void buildsort(){
buildHeap();
for(int last=array.length-1;last>=0;last--){
int tmp=array[0];
array[0]=array[last];
array[last]=tmp;
heapify(0,last-1);
}
}
private static void heapify(int top,int end){
int large=top*2+1;
int tmp=array[top];
while(large<=end){
if(large<end){
if(array[large]<array[2*top+2])
large=large + 1;
}
if(tmp>array[large]) break;
else{
array[top]=array[large];
array[large]=tmp;
top=large;
large=2*top+1;
}
print();
}
}
private static void print(){
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.println("");
}
}
算法复杂度:O(nlogn),算法不稳定
运行结果:
10 30 20 4 9 -1 10 6 15
10 30 20 15 9 -1 10 6 4
30 10 20 15 9 -1 10 6 4
30 15 20 10 9 -1 10 6 4
20 15 4 10 9 -1 10 6 30
20 15 10 10 9 -1 4 6 30
15 6 10 10 9 -1 4 20 30
15 10 10 6 9 -1 4 20 30
10 4 10 6 9 -1 15 20 30
10 9 10 6 4 -1 15 20 30
10 9 -1 6 4 10 15 20 30
9 4 -1 6 10 10 15 20 30
9 6 -1 4 10 10 15 20 30
6 4 -1 9 10 10 15 20 30
4 -1 6 9 10 10 15 20 30
-1 4 6 9 10 10 15 20 30
分享到:
相关推荐
堆排序是一种基于比较的排序算法,它通过构建和维护一个最大堆或最小堆来实现排序。在C语言中,我们可以自定义函数来实现这个过程。下面是对标题和描述中涉及的堆排序知识点的详细说明: 1. **最大堆**:在堆排序中...
本实验全集涵盖了多个重要的数据结构及其相关的算法,包括链表、约瑟夫问题、KMP模式匹配、二叉排序树、llink-rlink算法、关键路径以及堆排序。以下是对这些知识点的详细解释: 1. **链表**:链表是一种线性数据...
堆排序是一种基于比较的排序算法,它通过构建和调整二叉堆来实现数据的排序。在Java编程中,我们可以利用数组来表示堆,并通过一系列的操作将待排序的序列构建成一个大顶堆或小顶堆,然后进行交换和调整,最终达到...
例如,插入排序和选择排序适合小规模数据,冒泡排序虽然效率较低但实现简单,堆排序和快速排序在处理大规模数据时有较好性能,而基数排序则能处理非负整数排序。在实际开发中,根据具体需求选择合适的排序算法是非常...
堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在C语言中,我们可以利用数组来表示堆,并通过一系列的调整操作将无序序列转化为有序序列。以下是对堆排序及其C语言实现的详细解释。 ##...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...
本实验报告围绕“三种平均时间复杂度为O(nlogn)的内部排序算法的实现”展开,旨在通过实践加深学生对于快速排序、堆排序以及2路归并排序的理解和应用能力。以下是针对该实验报告所涉及的核心知识点的详细解析。 ###...
- **堆排序(`heapSort`)**:此函数实现了堆排序的核心逻辑。在每次迭代过程中,都将堆顶元素与堆的最后一个元素进行交换,然后减少堆的大小,并调整堆顶元素以确保堆的性质得到恢复。 通过这种方式,我们可以看到,...
根据给定的信息,本文将对九种不同的排序算法进行详细解析:选择排序、插入排序、冒泡排序、希尔排序、快速排序、箱子排序(计数排序)、基数排序、归并排序以及堆排序。 ### 一、选择排序 选择排序的基本思想是...
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。堆是一个特殊的树形数据结构,每个节点都有一个值,且满足以下性质:对于任意非叶子节点,其值都不小于(在最小堆中)或不小于(在最大堆中)...
6. **堆排序**:堆排序利用了堆这种数据结构,通过构建最大堆或最小堆,将堆顶元素与最后一个元素交换,然后调整堆,最终达到排序的目的。时间复杂度为O(nlogn)。 设计过程中,学生需要编写详细的设计说明,包括...
### 堆排序算法概述 堆排序是一种基于比较的排序技术,它利用了二叉堆的数据结构特性来高效地对数据进行排序。堆排序的基本思想是:先将待排序序列构造成一个大顶堆(或小顶堆),此时整个序列的最大值(或最小值)...
堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在Java中,我们可以利用数组来表示堆,并通过一系列的调整操作将无序序列转换成有序序列。以下是对堆排序算法及其在Java中的实现进行详细...
本文将深入探讨六种常用的内部排序算法:简单选择排序、直接插入排序、快速排序、冒泡排序、希尔排序以及堆排序,并对它们进行对比分析,旨在理解每种算法的特点及其适用场景。 #### 二、基本概念与原理 **1. 简单...
#### 六、堆排序算法的稳定性和复杂度 - **稳定性**: - 堆排序不是稳定的排序算法,意味着相同值的元素在排序后可能会改变原有的相对位置。 - 对于需要保持稳定性的情况,可以考虑使用其他稳定的排序算法。 - *...
在二维空间中,一个凸多边形是由一系列点(顶点)连接形成的闭合图形,其中任意两点之间的连线都在多边形内部。如果从多边形外部向内射入的任何直线都会与多边形的边界交于连续的两点或不相交,那么这个多边形就是凸...
堆排序的基本思想是通过一系列操作将待排序的数据转换成一个堆结构,然后再将这个堆结构中的最大值(对于大顶堆)或者最小值(对于小顶堆)取出,以此类推,直至所有数据被取出并按顺序排列。 具体来说,堆排序包含...
首先,排序算法是用来对一组数据进行排列的逻辑过程,它可以是升序或降序,常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序等。在PHP中,我们可以直接使用内置的`sort()`、`rsort()`、`a...