js排序算法01——冒泡排序

在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).

 

posted @ 2018-01-04 20:16  稀算客  阅读(256)  评论(0编辑  收藏  举报