冒泡排序

此种算法名为冒泡排序的原因:每一次轮回过后,未排序的值中最大的那个都会“冒”到正确的位置上。

冒泡排序的步骤

(1)指向数组中两个相邻的元素(最开始是数组的头两个元素),比较它们的大小。

 

(2)如果它们的顺序错了(即左边的值大于右边),就互换位置。 如果顺序已经是正确的,那这一步就什么都不用做。

(3)将两个指针右移一格。 重复第(1)步和第(2)步,直至指针到达数组末尾。

(4)重复第(1)至(3)步,直至从头到尾都无须再做交换,这时数组就排好序了。 这里被重复的第(1)至(3)步是一个轮回,也就是说,这个算法的主要步骤被“轮回”执行,直到整个数组的顺序正确。

冒泡排序的效率

冒泡排序的执行步骤可分为两种。

•比较:比较两个数看哪个更大。

•交换:交换两个数的位置以使它们按顺序排列。

O(N^2) 

js示例:

function hasDuplicateValue(array){  
  var steps=0;    
  for(var i=0; i < array.length; i++){      
    for(var j=0; j < array.length; j++){          
      steps++;            
      if(i !== j && array[i] == array[j]){              
        return true;            
      }        
    }  
 }
   console.log(steps);  
   return false;
 }

嵌套循环算法的效率就是O(N^2)

线性优化js示例:

function hasDuplicateValue(array){  
  var steps=0;    
  var existingNumbers=[];    
  for(var i=0; i < array.length; i++){      
    steps++;        
    if(existingNumbers[array[i]] === undefined){          
      existingNumbers[array[i]]=1;        
    } else {         
      return true;        
   }    
 }    
 console.log(steps);    
 return false;
}

 其大O记法是O(N)。

参考:数据结构与算法图解.4

原文地址:https://www.cnblogs.com/ooo0/p/12151825.html