public class HeapSort
{
int [] a = {3,1,5,2,4,9,8,7,6,4};
//数组的索引以0开始 ID也是从0开始
//父节点的索引
public int parentID(int childID)
{
return (childID-1)/2;
}
//左孩子的索引
public int leftChildID(int parentID)
{
return parentID*2+1;
}
/*
创建大顶堆,将数组初始为一个大顶堆
*/
public void creatMaxHeap()
{
int lastID = a.length-1;
for(int i = parentID(lastID); i >= 0 ; i--)
{
int k=i;
while(leftChildID(k) <= lastID)
{
int j = leftChildID(k);
if(j < lastID) //如果有两个孩子
{
if(a[j] < a[j+1]) //选大的那个孩子
{
j++;
}
}
if(a[k] < a[j]) 如果父结点比孩子小
{
int temp = a[k];
a[k] = a[j];
a[j] = temp;
k=j;
}
else break;
}
}
}
//调整大顶堆
public void maintainHeap(int lastID)
{
int k=0;
while(k <= parentID(lastID))
{
int j = leftChildID(k);
if( j < lastID)
{
if(a[j] <= a[j+1])
j++;
}
if( a[k] <a[j] )
{
int temp = a[j];
a[j] = a[k];
a[k] = temp ;
k = j;
}
else break;
}
}
public void heapSort()
{
creatMaxHeap();
int lastID = a.length-1;
while(lastID > 0)
{
int temp = a[lastID];
a[lastID] = a[0];
a[0] = temp;
lastID--;
if(lastID > 0)
maintainHeap(lastID);
}
}
public void printA()
{
for(int i = 0; i< a.length; i++)
{
System.out.println(a[i]);
}
}
public static void main(String args[])
{
HeapSort hs = new HeapSort();
hs.heapSort();
hs.printA();
}
}
分享到:
相关推荐
在学习堆排序前,我们需要知道顺序存储二叉树和堆的知识点。 一、顺序存储二叉树 1.概念:顺序存储二叉树即用数组的方式存储二叉树的节点 2.顺序存储二叉树的特点: ①顺序二叉树通常只考虑完全二叉树 ②第n个元素的...
堆排序(C语言实现)算法思想步骤程序 算法思想 见: 4. 选择排序—堆排序(Heap Sort) 算法导论——堆排序heapsort 步骤 1. 将n个元素建立初始堆,第一个节点放在数组下标1中,因此n个节点对应数组 a[1] ~ a[n],...
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。在计算机科学中,堆通常被理解为一个完全二叉树,其中每个父节点的值都大于或等于(大顶堆)或小于或等于(小顶堆)其子节点的值。堆排序算法...
1、 实现堆排序算法。 2、 理论分析并实验验证堆排序算法的时间复杂度。
内部排序之堆排序的具体代码实现,简单同时也易于看懂
主要介绍了C#堆排序实现方法,实例分析了C#对排序的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下