归并排序(Merge Sort)
和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间
算法简介
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序地序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-璐归并
算法描述和实现
把长度为n的输入序列分成两个长度为n/2的子序列
对这两个子序列分别采用归并排序
将两个排序好的子序列合并成一个最终的排序序列
js代码实现12345678910111213141516171819202122232425262728293031323334function mergeSort(arr){ var len = arr.length if(len < 2){ return arr } var middle ...
插入排序(Insertion Sort)
算法简介插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到响应位置并插入。插入排序早实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
in-place 解决问题过程中,只开辟了常数量的空间,与n无关,这是原址操作,就是In-place。
out-place 如果开辟的辅助空间与问题规模有关,则是out-place。
算法描述和实现一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复步骤2~5
js代码实现123456789101112131415const arr = ...
SSL证书过期更换ssl证书过期半年了,一直懒(麻烦)的更换,更换完成觉得
不是因为某件事很难,你才不想做,而是因为你不想做,才让这件事变得很难
1.获取新的SSL证书腾讯云搜索SSL证书
过期后需要立即选购
已拥有进入产品控制台,点击下载nginx版本证书
2.服务器更新SSL证书
通过nginx.conf找到ssl证书存放地址
我的nginx.conf在/101.34.xx.xx/etc/nginx/nginx.conf
进入101.34.xx.xx/etc/ssl把第一步下载的nginx证书替换掉原有的
3.重启nginx
登录nginx服务器
进入usr/sbin/
执行 ./nginx -s reload
查看nginx端口命令ps -ef | grep nginx
Nginx 服务器 SSL 证书安装部署
选择排序(Selection Sort)
表现最稳定的排序算法之一,因为无论什么数据进去都是O(n²)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一好就是不占用额外的内存空间。
算法简介选择排序(Selection-Sort)是一种简单直观的排序算法。他的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到以排序序列的末尾。以此类推,直到所有元素均排序完毕
算法描述和实现具体算法描述n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:
初始状态:无序区为R[1..n],有序区为空;
第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
n-1趟结束,数组有序化了。
js代码实现123456789101112131415161718 ...
冒泡排序(Bubble Sort)
算法描述冒泡排序是一种简单的排序算法。它重复的走访过要排序的数列,一次比较两个元素,如果它们顺序错我就把它们交换过来。走访数列的工作是重复的进行直到没有再需要交换。也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端
算法描述和实现具体算法描述
比较相邻的元素,如果第一个比第二个大,就交换他们两个
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
针对所有的元素重复以上的步骤,除了最后一个
重复以上步骤,直到排序完成
js代码实现12345678910111213141516171819const arr = [3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]function bubbleSort(arr){ // 外层循环控制比较轮数 for(let i = 0; i < arr.length ;i++){ // 里层循环控制每一轮比较的次数, arr[i] 只用跟其余的len ...
1.Markdown语法自带格式参考:Markdown语法图文全面详解(10分钟学会)
注意:此页面偶尔会存在CSS冲突问题!
1.1 代码块示例源码渲染演示12345678910111213\```shell# VSCode终端hexo clean; hexo shexo clean; hexo g; hexo dgit add .; git commit -m "npm publish"; npm version patch; git push# Cmder终端hexo clean && hexo shexo clean && hexo g && hexo dgit add . && git commit -m "npm publish" && npm version patchgit push\```1234567891011# VSCode终端hexo clean; hexo shexo clean; hexo g; hexo dgit add .; gi ...
requestHeader
请求头中的常见属性说明以及作用
实现功能
[x] Accept-Language 实现多语言
[x] Referer 实现防盗链
[x] Range 实现文件断点续传(206)
[x] Cache-Control & Last-Modified & ETag 实现缓存
[x] Accept-Encoding 实现文件压缩
[x] Cookie cookie使用已经封装setCookie
[x] session 基于cookie实现session使用
[x] JWT jwt使用
启动这个项目1234567891011git clone https://github.com/guozhiyuan16/share.git## 安装依赖cd shareyarn install## 推荐使用nodemon启动服务yarn global add nodemonnodemon app.js## 默认打开localhost:3000/index.html 即可看到演示项目
目录结构说明1234567891011.│└─share ...
大文件上传功能实现功能
[x] 大文件切片
[x] 断点续传
[x] 秒传
[x] 暂停上传
[x] 恢复上传
[x] 切片进度条
[x] 文件进度条
整体思路前端
核心是利用 Blob.prototype.slice 方法,和数组的 slice 方法相似,调用的 slice 方法可以返回原文件的某个切片
根据预先设置好的切片最大数量将文件切分为一个个切片,然后借助 http 的可并发性,同时上传多个切片,这样从原本传一个大文件,变成了同时传多个小的文件切片,可以大大减少上传时间
由于是并发,传输到服务端的顺序可能会发生变化,所以我们还需要给每个切片记录顺序
服务端
服务端需要负责接受这些切片,并在接收到所有切片后合并切片
何时合并切片 前端在每个切片中都携带切片最大数量的信息,当服务端接受到这个数量的切片时自动合并,也可以额外发一个请求主动通知服务端进行切片的合并
如何合并切片 使用 nodejs 的 读写流(readStream/writeStream),将所有切片的流传输到最终文件的流里
前端部分上传基本步骤123456789101112131415161718192 ...








