原理
依次比较相邻的两个值,如果后面的比前面的小,则将小的元素排到前面。依照这个规则进行多次并且递减的迭代,直到顺序正确。
示例:
var testArr = [1,4,2,67,43,45,32]
function bubbleSort(arr){
let len = arr.length
for(let i = 0;i<len;i++){
for(let j = 0;j<len - i;j++){
console.log(i,j)
if(arr[j] > arr[j+1]){//如果后面的数比前面的数小,将小的放前面,大的放后面
let tem = arr[j+1]//定义一个容器临时存储小的值
arr[j+1] = arr[j]//将大的赋值给下标在后面的
arr[j] = tem//将容器中的小值赋给下标在前的
}
}
console.log('sort',arr)
}
return arr
}
console.log(bubbleSort(testArr))
输出结果:
image.png
解析:
当i=0的时候,里面的循环完整执行,从j=0执行到j=6,这也就是第一遍排序,结果是将最大的数排到了最后,
这一遍循环结束后的结果应该是[1, 2, 4, 43, 45, 32, 67]
当i=1的时候,里面的循环再次完整执行,由于最大的数已经在最后了,没有必要去比较数组的最后两项,这也是j<len-1-i的巧妙之处,
结果是[1, 2, 4, 43, 32, 45, 67]
说到这里,规律就清楚了,每次将剩下数组里面最大的一个数排到最后面,当第一个循环执行到最后的时候,也就是i=5,此时,j=0,只需要比较数组的第一和第二项,比较完毕,返回。
举一反三
如果想从大到小,则只需要将
if(arr[j] > arr[j+1])
此处替换即可
替代方案
Array的prototype中有一个sort方法,用来对数组进行排序
let arr = testArr.sort((a,b)=>b - a)//降序
let arr = testArr.sort((a,b)=>a - b)//升序