在我们了解树之后,会接触到堆排序这个排序算法
很多新手会遇到一些疑问我这里做一个分享和解决
毕竟我也是新手,希望能帮上大家
堆排序的基本概念示意图之类的大家可以看这位博主的很赞
我只是对这一段代码的,为啥要进行两次for,以及为啥调用heapAdjest方法时
第一次for时是从arr.length - 1开始到0
第二次for时却是0开始
public static void HeapSorting(int[] arr) { for (int i = arr.length - 1; i >=0; i--) {//建堆 heapAdjest(arr, i, arr.length); } for (int i = arr.length - 1; i >= 0; i--) {//维系 int temp = arr[0]; arr[0]=arr[i]; arr[i] = temp; heapAdjest(arr, 0, i); } }
这里就是一个建堆的概念,刚刚开始时我们得到的数组无序的,我们通过第一次for建堆的到大顶堆(我这里是用法的大顶堆,我推荐的博主也是大顶堆,小顶堆同理),
第二个for则是我们不断的将根节点和i节点交换,我们再调用heapAdjest,保持住这个大顶堆
第一次学堆排序或者对堆排序任然有些不熟练的我建议可以照着推荐的博主的代码敲两遍(最好注释也跟写加强理解)
加油各位