堆排序

排序过程:将未排序的数组看成是一个完全二叉树,依次从右到左,从下到上,对字树根节点和左右子节点进行

                  比较,挑选出最大的(或者最小的)一个 数放到根节点,调整完成之后,得到最大的(或者最小  

                  的)数位于总根节点,然后再将其与最后一个数交换,继续前一个过程,最终得到一个 排好序的数组

 

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)   不稳定

 

代码下载:

http://download.csdn.net/detail/hbdatouerzi/9330395

posted @ 2015-12-06 11:08  黄大仙爱编程  阅读(122)  评论(0编辑  收藏  举报