基本思想:
相邻的元素进行两两比较,根据条件进行位置交换,每一趟会把最大或者最小的元素“冒”到顶端。最终达到完全排序
利用两轮循环加if条件语句,循环比较前后两项,最后排序
冒泡排序平均时间复杂度为O(n2),最坏时间复杂度为O(n2),空间复杂度为O(1),是最稳定排序
名词解释:
时间复杂度:时间复杂度是指一个算法执行所耗费的时间
空间复杂度:是指运行完一个程序所需要内存的大小
稳定性:如果a=b a在b的前面,排序后a仍然在b的前面
不稳定性:如果a=b a在b的前面 ,排序之后可能会发生位置变化
冒泡排序:
平均时间复杂度:O(nn) 最好情况:O(n)
最差情况:O(nn) 空间复杂度:O(1) 稳定性 :稳定
基础代码实现:
function Bubble(arr) {
var mid;
var len = arr.length - 1;
for (i = 0; i < arr.length; i++) {
for (j = 0; j < len; j++) {
if (arr[j + 1] < arr[j]) {
mid = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = mid;
}
}
console.log(arr);
}
return arr
}
var a = Bubble([1, 2, 3, 4, 5, 6, 7, 3, 4, 5])
console.log(a)
运行如图:
冒泡排序有两种优化方式:
优化外层循环:记录当前循环中是否发生了变化,如果没有变化则直接结束
内层优化:记录当前循环中最后一次元素交换的位置,改位置以后的序列都是已经排列好的序列,单独放一个数组李,下一轮循环的时候无需再去比较
优化后冒泡排序,最好的时间复杂度为O(n)
优化外层循环代码实现:
function Bubble(arr){
var mid;
var len = arr.length-1;
var position = 0;
for(i = 0;i< arr.length;i++){
var flag = 0;
for(j = 0;j < len; j++){
if(arr[j+1] < arr[j]){
mid = arr[j];
arr[j] = arr[j+1];
arr[j+1] = mid;
flag++;
}
}
console.log(arr);
if(flag == 0){break;}//
}
return arr
}
var a = Bubble([1,2,3,4,5,6,7,3,4,5,8])
新建了一个flag 当内层循环没有执行的时候 判断放回的flag是0,则直接跳出循环。
继续优化:
有的元素在一次执行之后,已经到了应该的位置吗,不需要比较了,要在内部的for循环交换位置的最后一个数字,并减少循环长度:
function Bubble(arr){
var mid;
var len = arr.length-1;
var position = 0;
for(i = 0;i< arr.length;i++){
var flag = 0;
for(j = 0;j < len; j++){
if(arr[j+1] < arr[j]){
mid = arr[j];
arr[j] = arr[j+1];
arr[j+1] = mid;
flag++;
position = j;
}
}
len = j;
console.log(arr);
alert(flag);
if(flag == 0){break;}//为什么不会终止?
}
return arr
}
var a = Bubble([1,2,3,4,5,6,7,3,4,5,8])
这里我加入了一个position 记录if语句的执行 下一次循环的时候,及可以缩短循环的长度