最新堆排序--java,java技术栈面试题

总结:心得体会

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。

学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。

面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

大厂Java架构核心笔记(适合中高级程序员阅读):

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

具有性质:

  1. 深度为k的完全二叉树,至少有2(k-1)个节点,至多有2k-1个节点。

2)树高h=log2n + 1。

满二叉树

一棵深度为k,且有2^k-1个节点的树是满二叉树。

另一种定义:除了叶结点外每一个结点都有左右子叶且叶子结点都处在 最底层的二叉树。

这两种定义是等价的

性质:

  1. 如果一颗树深度为h,最大层数为k,且深度与最大层数相同,即k=h;

2)它的叶子数是: 2^(h-1)

  1. 第k层的结点数是: 2^(k-1)

  2. 总结点数是: 2^k-1 (2的k次方减一)

5)总节点数一定是奇数。

6)树高:h=log2(n+1)。

通俗的讲:满二叉树,就是每一个父节点都有两个叶子节点,每一层要不全是叶子节点,要不全是父节点(也即是说每一层都是满节点的)。二完全二叉树则是除了最后一层外,其他的层都是满的,最后一层的叶子节点可以不满,且最后一层的叶子节点从左到右,左边没满,右边不能有子节点(最后一层的叶子节点都靠左排列)。

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:大顶堆的生序排序,小顶堆的降序排序。

代码实现:

import java.util.Arrays;

public class HeapSort {

public int[] sort(int[] sourceArray) throws Exception {

// 对 arr 进行拷贝,不改变参数内容

int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

int len = arr.length;

buildMaxHeap(arr, len);//构建大顶堆

for (int i = len - 1; i > 0; i–) {

swap(arr, 0, i);//使得数组的最后一定为最大的数

len–;

heapify(arr, 0, len);//刷新大顶堆

}

return arr;

}

/**

  • 构建大顶堆

  • @param arr 数据数组

  • @param len 数组长度

*/

private void buildMaxHeap(int[] arr, int len) {

//(int) Math.floor(len / 2) 向下取整,但是Math.floor()返回的类型是double,所以要强转成int

for (int i = (int) Math.floor(len / 2); i >= 0; i–) {

heapify(arr, i, len);

}

}

/**

  • 使得父节点大于等于左右子节点

  • @param arr 数组

  • @param i 父节点位置

  • @param len 数组长度

*/

private void heapify(int[] arr, int i, int len) {

int left = 2 * i + 1; //左子节点位置

int right = 2 * i + 2;//右子节点位置

int largest = i;

if (left < len && arr[left] > arr[largest]) {

largest = left;//如果左子节点的值大于父节点位置的值,则替换largest

}

if (right < len && arr[right] > arr[largest]) {

largest = right;//如果右子节点的值大于父节点位置的值,则替换largest

}

if (largest != i) {

swap(arr, i, largest);//交换使得父节点的值比左右子节点的值都大。

最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值