前言前端
對於非科班出身的程序員特別是前端工程師來講,算法的確實是一塊心病。買一本算法導論來擼幾個月同時還得學一門新語言既難以施行,也極度缺少性價比。程序員
本人自知才疏學淺,因此科學、全面、規範、嚴謹一概無論,但我會盡可能用通俗的語言和代碼讓缺少算法概念的人快速理解算法。算法
若是你以爲不錯,或者發現文章中的錯誤,或者有更好的建議,歡迎加入前端全棧羣交流,866109386。數組
後續文章中會涉及:常見排序算法、常見搜索算法、樹、分治法、動態規劃、貪心算法等bash
冒泡排序前端工程師
1、原理解析dom
選擇第1個和第2個數字,若是第1個>第2個兩者交換位置(假設是升序排列)。以後選擇第2個和第3個數字,相似交換處理。一輪下來後,最大的數字會「冒泡」到最後一位。函數
接下來,忽略已經拍好的數字,對於剩下的數字再來一輪性能
...測試
直到全部的數字都排列完成。
2、範例演示
如下表格里,紅色表示選中的待排序的數字,粗體表示本輪剛剛排列過的數字,藍色表示最終排好的數字。
第一輪: 1.選擇 10 和 34, 進行比較, 其中 10 < 34, 兩者不須要交換 2.選擇 34 和 21, 進行比較, 其中 34 > 21, 兩者須要交換 3.選擇 34 和 47, 進行比較, 其中 34 < 47, 兩者需不要交換 4.選擇 47 和 3, 進行比較, 其中 47 > 3, 兩者須要交換 5.... 6.最後 47 交換到末尾
第二輪:
忽略已經排列好的47, 按照剛剛的邏輯再次排序
...
3、實現方式
function bubleSort(arr) {
for(let i = 0; i < arr.length /*i表明輪數*/; i++) {
for(let j = 0; j < arr.length - i /*j表明當前輪選中的元素下標*/; j++) {
if(arr[j] > arr[j+1]) {
[ arr[j], arr[j+1] ] = [ arr[j+1], arr[j] ] /*交換元素*/
}
//console.log(arr)
}
}
}
var arr = [10, 34, 21, 47, 3, 28]
bubleSort(arr)
console.log(arr)
複製代碼
4、效率測試
下面咱們測試排序性能。如下的代碼中,randomArr 函數會生成一個隨機數組, 數組長度默認是100, 最大值默認值是1000。 console.time 和 console.end 用來記錄排序時間。
let arr = randomArr(10000, 100)
console.time('bubleSort')
bubleSort(arr)
console.timeEnd('bubleSort')
function randomArr( arrLen = 100, maxValue = 1000 ) {
let arr = []
for(let i = 0; i < arrLen; i++) {
arr[i] = Math.floor((maxValue+1)*Math.random())
}
return arr
}
function bubleSort(arr) {
for(let i = 0; i < arr.length; i++) {
for(let j = 0; j < arr.length - i; j++) {
if(arr[j] > arr[j+1]) {
[ arr[j], arr[j+1] ] = [ arr[j+1], arr[j] ] /*交換元素*/
}
}
}
}
複製代碼
經測試100次取平均值,得出初步結論:測試數組長度增長10倍,排序時間約增長100倍
複雜度分析
時間複雜度(能夠理解爲排序的次數)計算: (n-1) + (n-2) + ... + 1 = n*(1 + (n-1))/2,因此時間複雜度爲 O(n^2) ,和上面的測試基本一致。
若是你以爲不錯,或者發現文章中的錯誤,或者有更好的建議,歡迎進去前端全棧羣,866109386。