排序过程:将未排序的数组看成是一个完全二叉树,依次从右到左,从下到上,对字树根节点和左右子节点进行
比较,挑选出最大的(或者最小的)一个 数放到根节点,调整完成之后,得到最大的(或者最小
的)数位于总根节点,然后再将其与最后一个数交换,继续前一个过程,最终得到一个 排好序的数组
public void sorting() {
for(int i=array.length;i>0;i--){
this.buildingHeap(i);
this.exchange(i-1, 0);
}
}
private void buildingHeap(int n){
for(int i=n/2;i>0;i--){
adjustHeap(i-1,n);
}
}
private void adjustHeap(int n,int length){
int temp;
int left=2*n+1;
int right=2*n+2;
if(right<=length-1){//左右子数都有
if(array[left]>array[n]&&array[left]>array[right]){
exchange(n,left);
}else if(array[right]>array[n]&&array[right]>array[left]){
exchange(n,right);
}
}else if(right>(length-1)&&left<=(length-1)){//只有左子树,没有右子树
if(array[left]>array[n]){
exchange(n,left);
}
}
}
private void exchange(int m,int n){
int temp;
temp=array[m];
array[m]=array[n];
array[n]=temp;
}
时间复杂度: 平均 O(nlogn) 最好O(nlogn) 最坏O(nlognn) 不稳定
代码下载: