冒泡排序:
1.双层循环,因为自己不用跟自己比,所以循环的时候要arr.length-1,比如数组length为5,<5-1 -> < 4 ->那么就是0 1 2 3 循环四轮
2.外层循环是轮数,内存循环是比较次数(握手问题一样,你上一轮已经给我握过手了,咱俩比较过了,在次数循环中不需要给你握了。就减掉握过的轮数,也就是还需要再握几次)
3.找到后,通过一个中间容器,让两者交换位置
var arr1 = [3, 44, 13, 8, 9, 7, 1, 2]; function bubblingSort1(arr) { for (var i = 0; i < arr.length - 1; i++) { var temp = null; if (arr[i] > arr[i + 1]) { temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } return arr; } var res1 = bubblingSort1(arr1); console.log(res1); // [3, 13, 1, 8, 9, 7, 1, 2, 44] ->每次把最大的比较出来放到了最后面 // ------------------------------------------------------------------------------------------------ // 加入轮数:外面再加一层循环,表示每个数组中的每一个元素都要像上面那样去挨个与其他元素进行比较 var arr2 = [3, 44, 13, 8, 9, 7, 1, 2]; function bubblingSort2(arr) { for (var i = 0; i < arr.length - 1; i++) { for (var k = 0; k < arr.length - 1; k++) { var temp = null; if (arr[k] > arr[k + 1]) { temp = arr[k]; arr[k] = arr[k + 1]; arr[k + 1] = temp; } } } return arr; } var res2 = bubblingSort2(arr2); console.log(res2); // [1, 2, 3, 7,8, 9, 13, 44] // 冒泡复杂度:O(n ^ 2) // ------------------------------------------------------------------------------------------------ // 冒泡优化复杂度优化: // 外面是轮数,里面是元素依次比较,已经比较过的不用再次循环比较了,就把已经比较过的轮数给减掉, // 所以有了arr.length-1 - i, 减去的这个i是当前i++后的,也就是已经比较过的轮数(也可以说是比较过的元素) var arr3 = [3, 44, 13, 8, 9, 7, 1, 2]; function bubblingSort3(arr) { for (var i = 0; i < arr.length - 1; i++) { for (var k = 0; k < arr.length - 1 - i; k++) { var temp = null; if (arr[k] > arr[k + 1]) { temp = arr[k]; arr[k] = arr[k + 1]; arr[k + 1] = temp; } } } return arr; } var res3 = bubblingSort2(arr3); console.log(res3); // [1, 2, 3, 7,8, 9, 13, 44] // 优化后的复杂度是 O(n^2 /2) -> /2是常量级,复杂度不考虑常量级,所以其复杂度还是n的平方