小根堆排序
2020-06-21
定义 #
节点均小于其左孩子节点和右孩子节点
左孩子节点均小于其左右孩子节点
右孩子节点均小于其左右孩子节点
……
代码实现 #
public void buildHeap(int[] n,int len){//建立初始堆
for(int i=len/2;i>=1;i--){
adjustHeap(n,i,len);
}
}
public void adjustHeap(int[] n,int s,int len){//调整堆
for(int i=2*s;i<=len;i*=2){
//如果出现左右孩子节点大于该s节点时,该位置无需调整
//否则,不仅需要调整该s节点,还需要进行向下调整
if(i<len&&n[i]>n[i+1])
i++;
if(n[s]<n[i])
break;
else{
n[0]=n[i];
n[i]=n[s];
n[s]=n[0];
s=i;
}
}
}
public void heapSort(int[] n,int len){//堆排序
for(int i=len;i>1;i--){
//将堆顶元素与最后一个元素调换位置
n[0]=n[i];
n[i]=n[1];
n[1]=n[0];
//将未排序的前i-1个元素重新调整为堆
adjustHeap(n,1,(i-1));
}
}
复杂度 #
建立堆的时间复杂度:O(n)
堆排序的时间复杂度:O(nlogn)
空间复杂度:O(1)
不稳定的排序算法