js冒泡排序详解

140 阅读2分钟

冒泡排序(逆战班)

冒泡排序:对一个数值数组进行从小到大或从大到小的排序操作

语法:

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编码返回给指定的变量,再进行比较,实质上也是比较的数值大小

另附上排序算法的复杂度对比表

排序算法复杂度