BubleSort
复杂度分析
-
第一个for循环执行了length次
-
第二个for循环执行了length - i次
-
两个fore循环执行了length*(length-i)次,当length无限大复杂度是O(length^2)
思考
- 使用两个指针 j 和 j+1,因为要交换两个元素,所以需要两个指针分别指向需要交换的元素两个指针可以表示一定的范围,或者快慢两个
- 每一轮外层循环,都把最大的一个元素放到最后的位置(内层for不停的交换(即暂存最大值)两个相邻的元素),模型相当于把本轮的最大值从头部插入到已经排序的数组中 (本轮的最大值 —> [ 已经排序的元素 ] )
- 内层循环找最大值的方式先假设第一个是最大,从第二个元素开始比较,如果第一个比第二个大,交换(暂存最大值),然后和第三个比较
- 数组被分成了两部分,一部分是已经排序的,一部分待排序,以外层循环length - i -1下标作为分割
- 每个外层循环可以看作是当前元素的和其他元素产生的关系,类似图的邻接矩阵遍历,找到找到和当前顶点连接的所有顶点
- 数组可以按照下标操作,例如:图已经访问过的节点下标对应的值设置为1
代码
function BubleSort(arr){
const len = arr.length;
let temp = null;
for(let i = 0; i < len; i++){
for(let j = 0; j < len - i; j++){
if(arr[j] < arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}