冒泡排序
思路
冒泡排序的时间复杂度是O(n^2),它是将相邻的两项进行比较把较大的那个数放到后面,每比较完一轮都会把最大值放到末尾,直到比较了arr.length-1轮,把大的值依次找出排在到数第一位,到数第二位,每小轮就是相邻的相互比较,把大的放后面,不过上一轮找出的最大值不参与比较 优化:要是在一次大轮中,没有进行交换(也就是前面的值都小于后面的值,就不用进行下一次大轮比较了,直接跳出循环即可),设定一个flag,只要有前面值大于后面的情况就把flag设为true,这样如果整个小轮循环结束flag仍为false,就要跳出循环
代码
Array.prototype.bubble=function(){
let _this=this
//几大轮的次数
for(let i=0;i<_this.length-1;i++){
let flag=false
for(let j=0;j<_this.length-1-i;j++){
if(_this[j]>_this[j+1]){
flag=true
let temp=_this[j]
_this[j]=_this[j+1]
_this[j+1]=temp
}
}
if(!flag){
return _this
}
}
return _this
}
两个数据交换
let a=1,
b=2
-------------------
let temp=a
a=b
b=temp
-------------------
[a,b]=[b,a]
-------------------
a=a+b
b=a-b
a=a-b
插入排序
时间复杂度O(n^2)
思路
这个思路有点像打牌,先拿出一张牌放在手里,然后依次拿剩下的牌,把每次拿的牌更手中的牌从后往前比只要它大于某个值,就把它放到这个的后面,如果它不大于任何值就把它放到第一位
代码
Array.prototype.insert=function(){
let _this=this
let handle=[_this[0]]
for(let i=1;i<_this.length;i++){
let current=_this[i]
for(let j=handle.length-1;j>=0;j--){
if(current>handle[j]){
handle.splice(j+1,0,current)
break
}
}
if(current<handle[0]){
handle.unshift(current)
}
}
return handle
}
快排
时间复杂度O(n*log2(n))
思路
二分查找的思路,先找到它的中间值,然后取出那个值,把剩下的数组遍历把小于那个值的数据放到左边数组中,大于的放到右边数组中,利用递归处理两边的数组,把他们拼接
代码
Array.prototype.quick=function(){
let _this=this
if(_this.length<=1){
return _this
}
let index=Math.floor(_this.length/2)
let item=_this.splice(index,1)
let left=[]
let right=[]
for(let i=0;i<_this.length;i++){
let current=_this[i]
current<item?left.push(current):right.push(current)
}
return left.quick().concat(item,right.quick())
}