在codewars上面刷题卡住刷不下去了,意识到自己算法方面的不足,准备写一些算法方面的文章,此为一。
冒泡排序是很常见简单的算法了,每次比较任何两个相邻的项,如果第一个比第二个大,则交换他们,就像气泡一样,冒泡排序因此得名。
代码实现如下:
function Bubble(arr){ if(!Array.isArray(arr)){ return false; //类型判断 } else{ for (var i = arr.length; i > 0; i--) { for (var j = 0; j < i; j++) { if(arr[j]>arr[j+1]){ var exc; exc = arr[j]; arr[j] = arr[j+1]; arr[j+1] = exc; } } } return arr; } } var narr = [34,8,64,52,32,21]; Bubble(narr); //[8, 21, 32, 34, 52, 64]
这样每次循环把所循环的数组里最大的数放在最下面。为了判断一次循环后数组是否已经是顺序,可以添加变量记录交换次数,这样可以在每次循环结束时判断交换次数,次数为0则说明当下已经是顺序了,不需要进行循环了,改进后的算法如下:
function Bubble(arr){ if(!Array.isArray(arr)){ return false; //类型判断 } else{ for (var i = arr.length; i > 0; i--) { var flag = 0; for (var j = 0; j < i; j++) { if(arr[j]>arr[j+1]){ var exc; exc = arr[j]; arr[j] = arr[j+1]; arr[j+1] = exc; //交换位置 flag ++ ; //交换次数 } } if(flag===0){ break; } } return arr; } }
最好的情况(已经是顺序)时间复杂度为O(n),最坏的情况(逆序),时间复杂度为O(n2).