关于数组(笔记,更新ing)

排序

1.冒泡排序
    let arr = [1,3,4,2,7,5,6,8]
    function bubleSort(arr) {
    var len = arr.length;
    for (let outer = len ; outer >= 2; outer--) {
        for(let inner = 0; inner <=outer - 1; inner++) {
        	console.log("outer:"+outer)
        	console.log("inner:"+inner)
            if(arr[inner] > arr[inner + 1]) {
                [arr[inner+1],arr[inner]] = [arr[inner],arr[inner+1]]
            }
        }
    }
    return arr;
}
bubleSort(arr)
console.log(arr)
复制代码

关于冒泡排序有个细节就是,即使是数组已经完成排序,循环也不会停止。 打印出来的outerinner如图所示:

所以可以做出优化如下:

    let arr = [1,3,4,2,7,5,6,8]
    function bubleSort(arr) {
    var len = arr.length;
    for (let outer = len ; outer >= 2; outer--) {
    	let completeSort = true
        for(let inner = 0; inner <=outer - 1; inner++) {
        	console.log("outer:"+outer)
        	console.log("inner:"+inner)
            if(arr[inner] > arr[inner + 1]) {
                [arr[inner+1],arr[inner]] = [arr[inner],arr[inner+1]]
                completeSort = false
            }
        }
        if(completeSort){
        	break
        }
    }
    return arr;
}
bubleSort(arr)
console.log(arr)//[1,2,3,4,5,6,7,8]
复制代码

我们依然打印出outerinner

我们会发现,其实再最完成循环到 outer=6之时,数组已经完成了排序。

2.选择排序
let arr = [1,3,4,2,7,5,6,8]
function selectSort(arr) {
    var len = arr.length;
    for(let pos = 0 ;pos < len - 1; pos++) {
        for(let cur = pos ; cur<len; cur++) {
            if(arr[cur] < arr[pos]) {
                [arr[cur],arr[pos]] = [arr[pos],arr[cur]];
            }
        }
    }
    return arr
}
selectSort(arr)
console.log(arr)
复制代码

选择排序实现思路就是依次将数组的每一项元素都与所有其他元素比较大小,而后依照排列规则调换位置。

3.插入排序
let arr = [1,3,4,2,7,5,6,8]
function insertSort(arr) {
    for(let i = 1; i < arr.length; i++) {  
        for(let j = i; j > 0; j--) { 
            if(arr[j] < arr[j-1]) {
                [arr[j],arr[j-1]] = [arr[j-1],arr[j]];
                console.log(arr)
            } else {
                break;
            }
        }
    }
    return arr;
}
insertSort(arr)
复制代码

插入排序就是默认arr[0]这一段是有序的(只有一个元素当然是有序的咯),然后往这个有序片段里面插入元素,插入的方法是将无序片段(也就是首项之后的所有元素的片段)的每一项与有序片段里的每一段对比,按照规则将无序片段中的元素插入到有序片段中,从始至终保证有序片段的“纯净”。因为是与有序片段对比,所以如果与有序末尾的最后一个元素对比结果是不进入if的话,那后面也没需要对比,可以直接break了,这是需要注意的地方。

*快速排序
function quickSort(arr) {
	debugger
    if(arr.length <= 1) {
        return arr //递归出口
    }
    var left = [],
        right = [],
        current = arr.splice(0,1); //注意splice后,数组长度少了一个
    for(let i = 0; i < arr.length; i++) {
        if(arr[i] < current) {
            left.push(arr[i])  //放在左边
        } else {
            right.push(arr[i]) //放在右边
        }
    }  
    return quickSort(left).concat(current,quickSort(right)); //递归
}
复制代码

如代码所示,快速排序就是将每个元素与一个基准元素比较大小,然后按照规则判断这个元素是放在这个基准的左边还是右边,重复执行就可以得到一个有序的数组了。比如说一群人按身高来列队,我们将没有列好的队伍中选出一个人出列,作为基准,然后让所有身高比他高的站他右边,比他矮的站他左边。但是这样只操作一次肯定是得不到一个整齐的队伍的,所以我们还要对基准左右两边的人再进行这个操作。

至于为什么是current = arr.splice(0,1),是因为当最后left或者right中只剩余2个元素的时候,这两个元素间依然是要排序的,所以为了保证取到current,就必须是splice(0,1)或者splice(1,1),是不可随机选择的。

转载于:https://juejin.im/post/5cc185c46fb9a0323070d629

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值