堆排序是一种基于二叉树的排序,利用二叉树的性质进行排序的算法。但是这里的二叉树并不是真实存在的,是我们利用数组的编号进行设计的特殊的二叉树。
而堆排序其本质是一个就地排序算法。
/*
* 堆排序算法
* @version 1.0 2012/3/28
* @author akon
*/
package com.akon405.www;
public class HeapSort {
/*
* createMaxHeap的功能:
* 创建最大堆
*/
public void createMaxHeap(int[] A,int length){
int j;//最后一个非叶子节点
for(j=length/2-1;j>=0;j--){
heapAdjust(A,j,length);//依次遍历每个非叶结点,然后做出调整
}
}
/*
* heapAdjust的功能:
* 进行堆的调整,使它始终是最大堆
*/
public void heapAdjust(int[] A,int i,int length){
int l,r,temp;
l=i*2+1;//非叶节点的左子节点
r=i*2+2;//非叶节点的右子节点
int largest=i;//比较当前节点和子节点的大小的标志
while(l<length||r<length){
if(l<length&&r<length){
//当左右子节点都存在的时候
if(A[i]<A[l]&&A[r]<A[l]){
largest=l;
}
if(A[i]<A[r]&&A[r]>A[l]){
largest=r;
}
}else if(l<length&&r>=length){
//只有左子节点,没有右子节点
if(A[i]<A[l]){
largest=l;
}
}
if(largest!=i){
temp=A[i];
A[i]=A[largest];
A[largest]=temp;
i=largest;
l=i*2+1;
r=i*2+2;
}else{
break;
}
}
}
/*
* HeapSort的功能:
* 进行堆排序
*/
public HeapSort(int[] A,int length){
int temp;
createMaxHeap(A,length);//创建最大堆
System.out.print("最大堆:");
for(int i=0;i<A.length;i++){
System.out.print(A[i]+",");//输出我们第一次创建的最大堆(主要是用来调试程序)
}
while(length>1){
temp=A[length-1];
A[length-1]=A[0];
A[0]=temp;
length--; //把最大的数值放到数组末尾,然后再把堆进行整理,让剩余的数值继续构成一个最大堆
heapAdjust(A,0,length);
}
System.out.println("");
System.out.print("排序结果:");
for(int i=0;i<A.length;i++)
System.out.print(A[i]+",");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] A={40,10,32,8,78,98,20,3,1};
int length=A.length;
new HeapSort(A,length);
}
}
分享到:
相关推荐
堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法...
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。在计算机科学中,堆通常被理解为一个完全二叉树,其中每个父节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。堆排序分为...
堆排序----堆与堆排序10-从堆的定义可以看出,堆实质是满足如下性质的完全二叉树:二叉树中任一非叶子结点均小于(大于)它的孩子结点
3. **堆排序**:堆排序的核心在于循环执行“交换堆顶元素”和“堆调整”的过程,直到所有的元素都被正确放置。 - **代码实现**:`HeapSort`函数实现了完整的堆排序过程。它首先调用`BuildHeap`函数构建初始堆,...
3. **插入排序**: 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。Python实现插入排序通常用到一个for循环来遍历整个数组,内部则用一个while循环来...
常用的排序算法--堆排序,通过创建堆的方法进行排序
c语言实现堆排序。代码实现的是建立大根堆
堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在本场景中,我们关注的是堆排序的源代码,它适用于openSUSE 11.4操作系统,并且是使用GCC version 4.5.1编译器编译的。在这个名为"sort...
但是,快速排序的实际执行时间却比堆排序更快,这是因为快速排序的 cache freundliness 比堆排序更好。 快速排序、堆排序和归并排序都是 O(nlogn) 的时间复杂度,但是它们的稳定性、辅助空间和 cache freundliness ...
堆排序-flash演示 可自己输入数据............
Python 堆排序 堆排序 堆排序 堆排序 堆排序
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
数据结构排序 堆排序 堆排序是一种常用的排序算法,它使用大堆进行排序。下面是堆排序的详细知识点说明: 堆排序定义 堆排序是一种比较排序算法,它使用大堆(max heap)来对数组进行排序。堆排序的时间复杂度为O...
堆排序 堆排序 堆排序 堆排序 堆排序
3. **主排序函数**:该函数会先调用建堆函数,然后进入交换与调整的循环,每次循环都将堆顶元素与末尾元素交换,然后调整堆。 4. **数据结构**:可以使用一维数组来模拟完全二叉树,因为完全二叉树可以用数组顺序...
3. **完整实现**:在C++中,可以使用`make_heap()`函数来创建堆,`pop_heap()`函数来删除堆顶元素并调整堆,`sort_heap()`函数则可以直接完成堆排序。 下面是一个基本的C++实现堆排序的示例代码: ```cpp #include...
第28周-第01章节-Python3.5-堆排序复习.mp4
3. 重复第二步,直到堆的大小为1,排序完成。 三、堆排序的算法实现 以下是一个简单的C++实现堆排序的例子: ```cpp #include using namespace std; void heapify(int arr[], int n, int i) { int largest = i...
堆排序
3. 重构堆:在取出堆顶元素后,我们需要将剩余元素重新构建成堆,以便继续执行排序操作。 Java 实现: 在上面的代码中,我们使用 Java 语言实现了堆排序算法。其中,Heap 类中包括两个函数:heapSort 和 heapify。...