关于数组(笔记,更新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]
复制代码

咱们依然打印出outerinnerbash

咱们会发现,其实再最完成循环到 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了,这是须要注意的地方。ui

*快速排序
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)); //递归
}
复制代码

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

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

相关文章
相关标签/搜索