/**
*@Author wzy
*@Date 2017年11月15日
*@Version JDK 1.8
*/
//堆排序
public class HeapSort {
//构造小顶堆
static void adjustHeap(int a[],int n,int k) {
int l=2*k+1;//左孩子
int r=2*k+2;//右孩子
int min=0;//min相当于一个指针,指向父节点与左右孩子中的最小的
if(n>l&&a[k]>a[l]) min=l;
else min=k;
if(n>r&&a[r]<a[min]) min=r;
if(min==k)return;//如果min等于k说明k是最小元素
int tmp=a[k];//交换min与k对应的元素的值,在min的位置递归调用adjustHeap()
a[k]=a[min];
a[min]=tmp;
adjustHeap(a, n, min);
}
static void heapsort(int a[]){
for(int i=a.length/2-1;i>=0;i--) adjustHeap(a, a.length, i);//从最后一个非叶子节点开始构造堆
int n=a.length;
while (n>0) {
System.out.print(a[0]+" ");
//将构建好的小顶堆中的最后一个元素值与堆顶元素值互换,然后在对前n-1个元素继续递归调用adjustHeap()
int tmp=a[n-1];
a[n-1]=a[0];
a[0]=tmp;
n--;
adjustHeap(a, n, 0);
}
}
//打印构造出的堆
static void printHeapTree(int a[]) {
// level为堆的第几层
for (int level = 1; level < a.length; level *= 2) {
for (int start = level - 1; start < 2 * level - 1 && start < a.length; start++) {
System.out.print(a[start] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
int a[]= {56,42,324,6,76,23,87,12,45,67,0,1};
for(int i=a.length/2-1;i>=0;i--) adjustHeap(a, a.length, i);
heapsort(a);
}
}
堆排序(Java)
最新推荐文章于 2022-04-02 11:19:54 发布