时间复杂度(平均):O(n㏒₂n)
空间复杂度:O(1)
稳定性:不稳定
算法原理:利用完全二叉树的原理,将数组利用二叉树的形式,找到最大值,即根节点为整棵树的最大值。
图示:
1.buildheap(构造二叉树的过程)
2.maxheapfy(调整二叉树的过程)
代码:
public static void heap_sort(int array[]){
int length=array.length;
buildHeap(array,length);
for(int i=0;i<length;i++){
swap(array,0,length-1-i);//将根节点即最大值移到数组尾部
maxHeapfy(array,0,length-1-i);//重新调整堆结构
}
}
public static void maxHeapfy(int array[],int i,int heapsize){
int left=i*2+1;
int right=left+1;
int largest=i;//先假设根节点为最大节点
if(left<heapsize&&array[left]>array[largest]){
largest=left;
}
if(right<heapsize&&array[right]>array[largest]){
largest=right;
}
if(largest!=i){
swap(array,i,largest);
maxHeapfy(array,largest,heapsize);//假设根节点改变,下方节点需要跟着改变
}
}
public static void buildHeap(int array[],int heapsize){
for(int i=(heapsize-2)>>1;i>=0;i--){
maxHeapfy(array,i,heapsize);
}
}
private static void swap(int[] array, int i, int j) {
int a=array[i];
array[i]=array[j];
array[j]=a;
}