2024年前端最新【图解数据结构】排序全面总结(二),2024年最新字节跳动面试流程查询

总结:

  • 函数式编程其实是一种编程思想,它追求更细的粒度,将应用拆分成一组组极小的单元函数,组合调用操作数据流;

  • 它提倡着 纯函数 / 函数复合 / 数据不可变, 谨慎对待函数内的 状态共享 / 依赖外部 / 副作用;

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

Tips:

其实我们很难也不需要在面试过程中去完美地阐述出整套思想,这里也只是浅尝辄止,一些个人理解而已。博主也是初级小菜鸟,停留在表面而已,只求对大家能有所帮助,轻喷🤣;

我个人觉得: 这些编程范式之间,其实并不矛盾,各有各的 优劣势

理解和学习它们的理念与优势,合理地 设计融合,将优秀的软件编程思想用于提升我们应用;

所有设计思想,最终的目标一定是使我们的应用更加 解耦颗粒化、易拓展、易测试、高复用,开发更为高效和安全

算法讲解:

  1. 根结点值最大的叫大顶堆,根结点值最小的叫小顶堆,上图就是一个构造大顶堆的图
  1. 从最后一层开始,如果孩子结点的值比父亲结点大,那么就交换位置
  1. 一层层向上推,直到根结点值最大

建立初始堆:

void crt_heap(RecordType r[], int length )

/对记录数组r建堆,length为数组的长度/

{

int i,n;

n= length;

for ( i=n/2; i >= 1; --i) /* 自第[n/2]个记录开始进行筛选建堆 */

sift(r,i,n);

}

调整堆:

void sift(RecordType r[], int k, int m)

/* 假设r[k…m]是以r[k]为根的完全二叉树,且分别以r[2k]和r[2k+1]为根的左、右子树为大根堆,调整r[k],使整个序列r[k…m]满足堆的性质 */

{ RecordType t; int i,j; int x; int finished;

t= r[k]; /* 暂存"根"记录r[k] */

x=r[k].key; i=k; j=2*i;

finished=FALSE;

while( j<=m && !finished )

{

if (j<m && r[j].key< r[j+1].key ) j=j+1; /* 若存在右子树,

且右子树 根的关键字大,则沿右分支"筛选" */

if ( x>= r[j].key) finished=TRUE; /* 筛选完毕 */

else

{ r[i] = r[j]; i=j; j=2i; } / 继续筛选 */

}

r[i] =t; /* r[k]填入到恰当的位置 */

}

堆排序:

void HeapSort(RecordType r[],int length)

/* 对r[1…n]进行堆排序,执行本算法后,r中记录按关键字由大到小有序排列 */

{

int i,n; RecordType b;

crt_heap(r, length); n= length;

for ( i=n ; i>= 2; --i)

{

b=r[1]; /* 将堆顶记录和堆中的最后一个记录互换 */

r[1]= r[i];

r[i]=b;

sift(r,1,i-1); /* 进行调整,使r[1…i-1]变成堆 */

}

} /* HeapSort */

特点:

  • 堆选择是树形的改进,空间占用较小
  • 不稳定排序,适合n值较大的排序
  • 时间复杂度O(n*logn),空间复杂度O(1)

三、归并排序


法一:

  • 将整体数字一分为二,逐层细分
  • 细分完成后,每一块进行排序,直到整体有序

法二:

  • 将一串序列,相邻的两个归并到一起排序,再次把相邻两个有序的归并块再次排序,直到最后有序(优先推荐这种算法)

代码:

void MergeSort ( RecordType r[], int n) /* 对记录数组r[1…n]做归并排序 */

{

MSort ( r, 1, n, r);

}

void MSort(RecordType r1[], int low, int high, RecordType r3[])

/* r1[low…high]经过排序后放在r3[low…high]中,r2[low…high]为辅助空间 */

{

int mid; RecordType r2[20];

if (low==high) r3[low]=r1[low];

else

{

mid=(low+high)/2;

MSort(r1,low, mid, r2);

MSort(r1,mid+1,high, r2);

Merge (r2,low,mid,high, r3);

}

} /* MSort */

特点:

  • 稳定排序
  • 时间复杂度O(nlogn),空间复杂度O(n)
  • 附加空间比较大,很少用于内部排序,主要是外部排序

四、分配类排序


1.多关键字排序

  1. 高位优先:按照花色大小分成四类,在每一类中按照面值进行排序
  1. **低位优先:**按照面值大小分成13类,将相同面值的不同花色进行排序

2.链式基数排序

算法讲解:

  1. 对于上面的9个三位数,第一步我们按照个位数从小到大排序
  1. 接着第一步的结果,按照十位数从小到达排序
  1. 最后借助第二步的结果,按照百位数从小到大排序
  1. 同样的,对于4位 5 位方法一样

特点:

  • 时间复杂度O(d*n),d是关键字数,n是记录数
  • 稳定的排序
  • 空间复杂度=2个队列指针+n个指针域

五、总结归纳


排序算法平均时间复杂度空间复杂度稳定性特点
简单选择排序O(n*n)O(1)不稳定适合基本有序
树形选择排序O(n*logn)O(n)稳定占用空间过大
堆选择排序O(n*logn)O(1)不稳定适合n值较大的排序
归并排序O(n*logn)O(n)稳定子序列要求有序
基数排序O(d*n)2个队列指针+n个指针域稳定适合关键字位数较小

附录:

JavaScript

  • js的基本类型有哪些?引用类型有哪些?null和undefined的区别。

  • 如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)

  • Object是引用类型嘛?引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?

  • JS常见的dom操作api

  • 解释一下事件冒泡和事件捕获

  • 事件委托(手写例子),事件冒泡和捕获,如何阻止冒泡?如何组织默认事件?

  • 对闭包的理解?什么时候构成闭包?闭包的实现方法?闭包的优缺点?

  • this有哪些使用场景?跟C,Java中的this有什么区别?如何改变this的值?

  • call,apply,bind

  • 显示原型和隐式原型,手绘原型链,原型链是什么?为什么要有原型链

  • 创建对象的多种方式

  • 实现继承的多种方式和优缺点

  • new 一个对象具体做了什么

  • 手写Ajax,XMLHttpRequest

  • 变量提升

  • 举例说明一个匿名函数的典型用例

  • 指出JS的宿主对象和原生对象的区别,为什么扩展JS内置对象不是好的做法?有哪些内置对象和内置函数?

  • attribute和property的区别

  • document load和document DOMContentLoaded两个事件的区别

  • JS代码调试

  • 开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值