package com.zp.algorithm.basic;
import java.util.Arrays;
public class HeapSortDemo {
//节点的左节点
private static int left(int i)
{
return i<<1;
}
//节点的右节点
private static int right(int i)
{
return (i<<1)+1;
}
//维持树的最大堆性质
private static<AnyType extends Comparable<? super AnyType>> void max_heapify(AnyType[] a,int i)
{
int l = left(i);
int r = right(i);
int largest = 0;
if(l<=a.length-1&&a[l].compareTo(a[i])>0)
{
largest = l;
}else{
largest = i;
}
if(r<=a.length-1&&a[r].compareTo(a[largest])>0)
{
largest = r;
}
if(largest!=i)
{
AnyType tmp = a[i];
a[i] = a[largest];
a[largest] = tmp;
max_heapify(a, largest);
}
}
private static<AnyType extends Comparable<? super AnyType>> void build_max_heap(AnyType[] a)
{
int heap_size = a.length - 1;
for(int i = heap_size/2;i>0;i--)
{
max_heapify(a,i);
}
}
private static<AnyType extends Comparable<? super AnyType>> AnyType[] heapsort(AnyType[] a)
{
build_max_heap(a);
AnyType[] tmp = (AnyType[]) new Comparable[a.length-1];
for(int i = a.length-1;i>0;i--)
{
swap(a, i, 1);
tmp[i-1] = a[i];
a = subArray(a);//
max_heapify(a, 1);
}
return tmp;
}
private static <AnyType extends Comparable<? super AnyType>>void swap(AnyType[] a,int i,int j)
{
AnyType tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
private static <AnyType extends Comparable<? super AnyType>>AnyType[] subArray(AnyType[] a)
{
AnyType[] new_a = (AnyType[]) new Comparable[a.length -1];
for(int i = 0;i<a.length-1;i++)
{
new_a[i] = a[i];
}
return new_a;
}
public static void main(String[] args) {
Integer i[] = {0,16,4,10,14,7,9,3,2,8,1};
// System.out.println(Arrays.toString(i));
// build_max_heap(i);
//
// System.out.println(Arrays.toString(i));
// max_heapify(i, 2);
// System.out.println(Arrays.toString(i));
System.out.println(Arrays.toString(heapsort(i)));
}
}
堆排序实现(java)
最新推荐文章于 2022-08-13 22:33:55 发布