您的位置:首页 > 其它

堆排序

2015-12-06 11:08 162 查看
排序过程:将未排序的数组看成是一个完全二叉树,依次从右到左,从下到上,对字树根节点和左右子节点进行
                  比较,挑选出最大的(或者最小的)一个 数放到根节点,调整完成之后,得到最大的(或者最小  
                  的)数位于总根节点,然后再将其与最后一个数交换,继续前一个过程,最终得到一个 排好序的数组
 
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
&&array[left]>array[right]){
exchange(n,left);
}else if(array[right]>array
&&array[right]>array[left]){
exchange(n,right);
}
}else if(right>(length-1)&&left<=(length-1)){//只有左子树,没有右子树
if(array[left]>array
){
exchange(n,left);
}
}
}

private void exchange(int m,int n){
int temp;
temp=array[m];
array[m]=array
;
array
=temp;
}


时间复杂度: 平均 O(nlogn)         最好O(nlogn)       最坏O(nlognn)   不稳定

 

代码下载:

http://download.csdn.net/detail/hbdatouerzi/9330395
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: