从图中我们可以看到,冒泡排序,是相邻的两个数值进行比较,较大的排到右边,依此循环最终得到一个升序的数组排序;(相邻两数,两两比较,大的放后面,重复进行;遍历完一次,最大的值会放在最后面)
从上面所知,得到最大的数后不再进行比较
综上所述,有如下两层for循环情况
- 双层for循环
- 外层for循环:从0开始遍历数组的每一个元素。区间是
[0,len - 1]
- 内层for循环:从索引0开始,比较索引i和索引i+1的值,值大的放后面。
- 外层一次遍历,尾部就确定了一个数的顺序,所以区间是
[0,len-1-i]
- 外层一次遍历,尾部就确定了一个数的顺序,所以区间是
- 外层for循环:从0开始遍历数组的每一个元素。区间是
function swap(arr, i, j){
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//sort为true时是升序,否则为降序
function bubbleSort(arr,sort){
let len = arr.length;
for(let i = 0;i< len;i++){
for(let j = 0;j<len-i-1;j++){
let result = (sort ? arr[j] > arr[j+1] : arr[j] < arr[j+1]);
if(result){
swap(arr,j+1,j);
}
}
}
return arr;
}
console.log(bubbleSort([4,3,5,1],true));
从上述,我们可以知道时间复杂度在O(n)~O(n^2)之间(即有序[1, 3, 4, 5]和逆序[5, 4, 3, 1])