此种算法名为冒泡排序的原因:每一次轮回过后,未排序的值中最大的那个都会“冒”到正确的位置上。
冒泡排序的步骤
(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