排序
基本排序
基本思想是使用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();