堆排序
大堆:元素升序排列。
小堆:元素降序排列。
原理:
- 找堆的倒数第一个非叶子节点最后一个叶子:size-1 他的双亲((size-1)-1)>>1 -->(size-2)>>1;
- 从倒数第一个非叶子节点的位置开始向下调整,一直向前调整到根节点的位置为止利用堆删除的思想来进行排序—》用堆顶元素与堆中最后一个元素进行交换,将堆中元素减少一个,再将堆顶元素向下调整。
代码实现:
public static void shiftDown(int[] array,int parent,int size) {
int child = parent*2+1;
while (child < size) {
if(child + 1 < size && array[child+1] > array[child]) {
child += 1;
}
if(array[child] > array[parent]) {
swap(array,child,parent);
parent = child;
child = parent*2+1;
}else {
break;
}
}
}
public static void heapSort(int[] array) {
int lastLeaf = (array.length-2) >> 1;
for(int root = lastLeaf;root >= 0;root--) {
shiftDown(array,root,array.length);
}
// 2、利用堆删除的思想排序
int end = array.length - 1;
while(end >= 0) {
swap(array,0,end);
shiftDown(array,0,end);
end--;
}
}
性能分析:
稳定性:不稳定