堆排序的思想是:
1.比较第i个位置与第2i和2i+1个位置上的节点值,将较大的元素上移;
2.重复1,使最大的元素移到根节点;
3.将根节点与最末的元素交换位置,递归1,2,3使剩下的n-1个元素也依次移到当前最后。
static void heapSort( int[]a ){
for(int n=a.length;n>0;n--){
//n,i均表示的是位置,不是数组下标;从整个堆开始,
for(int i=n/2;i>0;i--){
//比较父节点与子节点的值,将大的往上调
if((2* i< n)&&( a[ i-1]< a[2* i])){ //满二叉树
swap(a,i-1,2*i); // 不能使用swap(a[i-1],a[2*i]),因为数组传递不过去,不能对数组元素值进行处理
}
if( a[ i-1]< a[2* i-1]){
swap(a,i-1,2*i-1);
}
}
swap(a ,0,n -1); //每次找到最大值存储在最末的位置
}
}
堆排序的时间复杂度为:O(n*log2n)。堆排序是一种不稳定的排序方法。