堆排序
排序过程:将未排序的数组看成是一个完全二叉树,依次从右到左,从下到上,对字树根节点和左右子节点进行
比较,挑选出最大的(或者最小的)一个 数放到根节点,调整完成之后,得到最大的(或者最小
的)数位于总根节点,然后再将其与最后一个数交换,继续前一个过程,最终得到一个 排好序的数组
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) 不稳定
代码下载: