1,堆排序本身是一个选择排序 他的时间复杂度O(nlogn)是不稳定排序
2,对是具有二叉树的性质;每个节点的值都大于或等于其左右的节点的值 称之为大顶堆(代码标出排查大顶堆之前会和右子节点进行对比)
3,大顶堆 是升序排列 小顶堆是降序排列
首先要以下列图片去理解怎么去进行选择排序的
这样我们就完成了第一次排序 并且把9这个最大值选择了出来
下面看代码是怎么实现的
//首先把要排序的数组,和第一个非叶子节点(没有子节点叫叶子节点)和数组的长度放进去
//(这些数据需要递归 所以要以参数的方式放进去)
public static void adjustHeap(int[] arr, int i, int length) {
//定义temp 赋值非叶子节点的值(在最后两个值调换需要用到)
int temp = arr[i];
//这里要以for循环进行比对大小 k=i*2+1 意思是这个非叶子节点的左子节点
//每次增加k=k*2+1 每次循环都要和左子节点判断
for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
//先去判断有没有右子节点先去比较左右子节点的大小
if (k + 1 < length && arr[k] < arr[k + 1]) {
//本身现在是左子节点 要是右子节点大就k++;
k++;
}
//这样排查出来之后和第一个非叶子节点对比大小如果子节点的值大于父节点就赋值
if (arr[k] > temp) {
arr[i] = arr[k];
//这里说明子节点要在循环结束后才可以赋值 因为不知道会循环几次 只要赋值
//一次就好了
i = k;
} else {
//因为是从最后一个非叶子节点开始换值所以只要判断一次如果父节点大直接结束
//循环就可以
break;
}
}
arr[i] = temp;
}
这段代码开始就要分离最大的值了
public static void heapSort(int[] arr) {
int temp = 0;
//这里就是吧非叶子节点的角标算出来调动上面的方法 然后把所有非叶子节点都调用一遍
//获得最大值
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjustHeap(arr, i, arr.length);
}
//然后吧 第一个值和最大值调换 并且j--不在使用最大值
for(int j=arr.length-1;j>0;j--) {
temp=arr[j];
arr[j]=arr[0];
arr[0]=temp;
//这时开始用第一个节点开始循环
adjustHeap(arr, 0, j);
}
System.out.println(Arrays.toString(arr));
}
数字少的数组还好理解 数字多了循环次数太多了 就无法讲解明白了
介意自己去看一遍代码 我感觉我这些的有个地方不对 但是我现在实在想不出来了