前端系列之基础算法-排序

156 阅读2分钟

排序

基本排序

基本思想是使用for循环嵌套for循环,称之为经典排序,也是最普通的排序。

冒泡排序

核心思想是两两对比,然后交换位置,接下来我们渐进式写出冒泡排序。

[4,1,5,3,2]

数组两两对比,4和1对比,4比1大,交换位置,得到结果:

[1,4,5,3,2]

4和5对比,5比4大,不用动,结果:

[1,4,5,3,2]

5和3对比,5比3大,交换位置,结果:

[1,4,3,5,2]

接下来类推,得到结果

[1,4,3,2,5]

首先写交换代码:

如果(数组的第一个大于第二个){
    解构赋值:[[第一个变成第二个][第二个变成第一个]]
}

if( array[i] > array[i + 1] ){
    [array[i + 1],array[i] ] = [array[i], array[i+1]]
}

我们要循环几次呢,当然是元素个数减1次,因为是两两对比,第1个元素跟第2个元素对比,到了第2个元素会和第3个元素对比,以此类推,始终少了自己,因为自己不用跟自己对比。

开始循环交换:

循环(数组第一个元素 跟数组其他元素一一交换对比,变量i始终为第二个元素交换的第1个元素位置){
    ...
}

for(let i=0, i < array.length-1,i++) //包裹for循环
    if( array[i] > array[i + 1] ){
        [array[i + 1],array[i] ] = [array[i], array[i+1]]
    }
}

到此为止只排了一次,现在需要将所有元素进行排序,变量j第一次循环从数组第一个元素开始依次对比,当变量j第二次循环,从数组第二个元素开始依次对比,因为两两对比,最后两个元素不用循环(在实际中,我发现即使不考虑最外层循环的次数,直接写成数组长度也没问题),代码如下:

for(let j=0, j< array.length-2,j++){ //再次包裹for循环
    for(let i=0, i < array.length-1,i++){
        if( array[i] > array[i + 1] ){
            [array[i + 1],array[i] ] = [array[i], array[i+1]]
        }
    }
}

主体代码完成之后,最终代码:


const sort = () => {
    let array = [3,4,1,5,2];
    for(let j=0, j< array.length-2,j++){
        for(let i=0, i < array.length-1,i++){
            if( array[i] > array[i + 1] ){
                [array[i + 1],array[i] ] = [array[i], array[i+1]]
            }
        }
    }
    console.log( array );
}
sort();