数据结构之-三大排序算法

258 阅读2分钟

冒泡排序

思路

冒泡排序的时间复杂度是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())
}