JavaScript 冒泡排序及其优化
冒泡排序是对于前端工程师来说是一种基础的算法,这种算法在执行的过程中,因为会将前后项不断比较,就像是空气从水中不断浮现的过程,所以被称之为冒泡排序.
冒泡排序一般整体思路, 是用两轮for循环加if条件语句,循环比较前后两项,较大项,将其后置.也可以较小项后置.
算法时间复杂度一般为O(n^2),最少为O(n),最大为O(n^2).
源码:
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)
如果是对以上的数组进行排序,其实根本不需要执行 n^2 那么多次数,数组就已经将顺序排好了.那么我们就可以将其优化,当数组已经不进行比较的时候,就停止循环.
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 = 0;如果此次循环当中没有发生交换,也就是if语句后面没有执行的话,那么就说明,数组已经完成排序,所以直接跳出.
如果排序的 数组是[1,2,3,4,5,6] 那么数组执行一次外层for循环之后就会停止,这也是O(n)的由来.
但是,有些元素在循环执行一次之后,其实已经到了应该到的位置,比如说 8这个数字,已经不需要比较了,所以我们应该找到内部的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语句执行的位置,开始下一次内层for循环的时候,循环长度缩短.达到优化的目的.

浙公网安备 33010602011771号