堆排序
时间复杂度: n*log2(n)
稳定性: 不稳定
实现: 将给定的数组当成一棵二叉树,从最后一个子树的开始向下调整,结束后是一个大根堆;
将根节点元素与最后一个元素交换,将大的存到数组最后,交换完再向下调整,循环直到交换结束
基本原理: 也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的数。
- 注意: 排升序要建大堆;排降序要建小堆。
堆排序过程示例:
public static void adjustDown(int[] array,int root,int len){
int parent = root;
int child = parent*2+1;
while(child < len){
//判断是否有右孩子,且谁最大
if(child +1 < len && array[child] < array[child+1]){
child = child + 1;
}
//child 肯定是左右孩子的最大值下标
if(array[child] > array[parent]){
int tmp = array[child];
array[child] = array[parent];
array[parent] = tmp;
parent = child;
child = 2*parent+1;
}else {
break;
}
}
}
public static void heapSort(int[] array){
for(int i = (array.length-1-1)/2;i>=0;i--){
adjustDown(array,i,array.length);
}
int end = array.length-1;
while(end >0){
int tmp = array[0];
array[0] = array[end];
array[end] = tmp;
adjustDown(array,0,end);
end--;
}
}