冒泡排序(逆战班)
冒泡排序:对一个数值数组进行从小到大或从大到小的排序操作
语法:
let arr=[0,1,4,2,7,2,5,8,10,4,5,7,3,8,9]
arr.sort(function(latter, front) {
return latter - front; // 后一项减前一项(从小到大)
return front - latter; // 前一项减后一项(从大到小)
});
输出结果:
return latter - front; // 后一项减前一项(从小到大)
return front - latter; // 前一项减后一项(从大到小)
冒泡排序动画演示
下面我们来实现sort的重构:
function sorts(arr) {
// 定义变量len,值为数值长度减1
// (因为数值最后一项不会和后面不存在的进行比对
// 所以只进行到最后第二项和最后一项的比对)
let len = arr.length - 1;
// 遍历数组
for (let i = 0; i < len; i++) {
// 循环比较前一项和后一项的大小
for (let j = 0; j < len - i; j++) {
// 如果第j项大于j+1项,也就是前一项大于后一项的话
// 如果要从大到小排序,只需要改变为: arr[j] < arr[j + 1]
// 去判断前一项是否小于后一项即可
if (arr[j] > arr[j + 1]) {
// 定义一个第三方变量先存储要交换的值
// 这里将后一项先存储在第三方变量中
let temp = arr[j + 1];
// 将前一项的值交换给后一项
arr[j + 1] = arr[j];
// 再把第三方存储的后一项的值给前一项
arr[j] = temp;
}
}
}
}
下面做简单的分析:
冒泡排序
i 的目的是做多少轮的 比较 j和j+1是前后数据比较
var arr=[4,1,7,2];
遍历数组:for (let i = 0; i < len; i++)
当i==0时
arr[i]=4
内层循环:for (let j = 0; j < len - i; j++)
j=0 arr[j]=4 arr[j+1]=1 4,1,7,2---->1,4,7,2
j=1 arr[j]=4 1,4,7,2--->1,4,7,2
j=2 arr[j]=7 1,4,7,2--->1,4,2,7
j=3 arr[j]=7 arr[j+1]不存在
因为j+1超过数组的长度,所以j必须是长度-1
所以会先将len定义为:let len = arr.length - 1;
当i==1时;
j==0 arr[j]=1 1,4,2,7--->1,4,2,7
j==1 arr[j]=4 1,4,2,7--->1,2,4,7
j==2 上面一次循环中放在最后的是最大的,所以不需要循环到2
当i==2时;
j=0 arr[j]=1 1,2,4,7-->1,2,4,7
如果需要比较字母的大小,则需要通过
charCodeAt()方法,将字母对应的Unicode编码返回给指定的变量,再进行比较,实质上也是比较的数值大小
另附上排序算法的复杂度对比表