堆排序(Heapsort)是指利用堆所设计的一种排序算法。
那么什么是堆呢???
堆就是一棵顺序存储的完全二叉树
那么什么又是完全二叉树呢???

上图就是一个完全二叉树,它的特点有:
- 从作为第一层的根开始,除了最后一层之外,第N层的元素个数都必须是2的N次方
- 每一行的元素都从最左边开始放,两个元素之间不能有空隔
堆就是一棵顺序存储的完全二叉树
小根堆——父节点的值不大于子节点的值
大根堆——父节点的值不小于子节点的值
下面我们就来研究堆排序的排序过程~


根据上面的步骤,一步一步的调整就可使一组数有序
代码展示
public class TestHeapSort {
public static void heapSort(int[] array){
//建立大根堆====》不断调整
for (int i = (array.length-1-1)/2; i >= 0; i--) {
adjust(array,i,array.length-1);//log2n
}// n/2 * log2n ==> n*log2n
//交换 ---》 调整
for (int j = 0; j <= array.length-1; j++) {
int tmp = array[0];
array[0] = array[array.length-1-j];
array[array.length-1-j] = tmp;
adjust(array,0,array.length-1-j-1);
}
}
public static void adjust(int[] array,int start,int end){
int tmp = array[start];
for (int i = 2*start+1; i <= end ; i = i*2+1) { //找到左右孩子的最大值
if (i < end && array[i] < array[i+1]) {
i++;
}//此时i的位置肯定是最大值的下标
if (array[i] > tmp){ //将最大值交换,建立大根堆
array[start] = array[i];
start = i;
}
if (array[i] < tmp){ //本来就是大根堆,则不用交换
break;
}
}
array[start] = tmp;
}
}
本文深入解析了堆排序算法,包括堆的概念、完全二叉树的特点、小根堆与大根堆的区别,以及堆排序的具体实现过程。通过代码示例,详细展示了如何通过调整建立大根堆并进行排序。
3万+

被折叠的 条评论
为什么被折叠?



