算法描述:算法
var arr = [5, 6, 3, 1, 8, 7, 2, 4]; for(let i = 1;i<arr.length;i++){ let myIndex = i; console.log('次數:'+i); for(let j = i-1 ; j >= 0 ; j -- ){ console.log('單次比較數據:'+arr[myIndex]+'---'+arr[j]) if(arr[myIndex] < arr[j]){ [arr[myIndex],arr[j]] = [arr[j],arr[myIndex]]; myIndex = j; }else{ break; } console.log('數組'+arr); } }
時間複雜度 O(n^2)
運行過程數組
算法描述函數
var arr = [5, 6, 3, 1, 8, 7, 2, 4]; for(let i = 0; i < arr.length - 1;i++){ console.log('次數'+Number(i+1)) let minIndex = i; for(let j = i ;j < arr.length - 1; j++){ console.log('單次比較數據:'+arr[minIndex]+'---'+arr[j+1]) if(arr[minIndex] > arr[j+1]){ minIndex = j+1; } } [arr[minIndex],arr[i]] = [arr[i],arr[minIndex]]; console.log('數組'+arr); }
時間複雜度 O(n^2)ui
運行過程spa
就幾種算法來看,感受冒泡是比較慢的
算法描述:3d
var arr = [5, 6, 3, 1, 8, 7, 2, 4]; let count = 0; for(let i = arr.length ; i > 0; i --){ console.log('次數'+i); for(let j = 1; j < i; j ++){ console.log('單次比較數據:'+arr[j]+'----'+arr[j-1]) if(arr[j] < arr[j-1]){ [arr[j],arr[j-1]] = [arr[j-1],arr[j]] } } console.log(arr); }
時間複雜度 O(n^2)code
運行過程blog
歸併排序的圖可能一下看不懂,是由於圖表明的是運行的過程,主要看算法描述
歸併排序:其基本思想是分治策略,先進行劃分,而後再進行合併。
假設要對數組C進行歸併排序,步驟是:
1.先將C劃分爲兩個數組A和B(即把數組C從中間分開)
2.再分別對數組A、B重複步驟1的操做,逐步劃分,直到不能再劃分爲止(每一個子數組只剩下一個元素),這樣,劃分的過程就結束了。
如: [12 20 30 21 15 33 26 19 40 25]
劃分爲: [12 20 30 21 15] [33 26 19 40 25]排序
[12 20] [30 21 15] [33 26] [19 40 25] [12] [20] [30] [21 15] [33] [26] [19] [40 25] [12] [20] [30] [21] [15] [33] [26] [19] [40] [25]
3.而後從下層往上層不斷合併數組,每一層合併相鄰的兩個子數組,合併的過程是每次從待合併的兩個子數組中選取一個最小的元素,而後把這個元素放到合併後的數組中,不斷重複直到把兩個子數組的元素都放到合併後的數組爲止。
4.依次類推,直到合併到最上層結束,這時數據的排序已經完成了。ip
var arr = [5, 6, 3, 1, 8, 7, 2, 4,9]; function mergeSort(arr){ if(arr.length === 1){ return arr; } let midIndex = Math.floor(arr.length / 2); let leftArr = arr.slice(0,midIndex); let rightArr = arr.slice(midIndex); console.log('拆分數組'+leftArr+'------'+rightArr) return mergeFn(mergeSort(leftArr),mergeSort(rightArr)); }. function mergeFn(left,right){ let tmp = []; console.log(left + '----' + right); while (left.length && right.length) { console.log('單次比較數據:'+left[0]+'和'+right[0]+'誰小誰所在的數組就被shift掉一個') if (left[0] < right[0]){ tmp.push(left.shift()); } else{ tmp.push(right.shift()); } console.log(tmp); } let arra = tmp.concat(left, right); console.log('本次比較完畢:'+arra); return arra; } mergeSort(arr);
時間複雜度 O(nlogn)
運行過程,看了運行過程就能看懂圖了,也知道js函數裏的參數有函數的狀況下的執行順序是自左向右
圖上的運行方式是按照基準是第0號位算的,看起來稍微有點亂,不過只要知道快排是怎麼算的就行了
算法描述:
var arr = [5, 6, 3, 1, 8, 7, 2, 4]; function quickSort(arr){ if(arr.length <= 1){ return arr; } //找基準 let midIndex = Math.floor(arr.length/2); //剔除基準值 let midNum = arr.splice(midIndex,1)[0]; console.log('基準值:'+midNum); let leftArr = [],rightArr=[]; for(let i = 0 ; i < arr.length; i++){ //小於基準的進左邊,大於的進右邊 arr[i] < midNum ? leftArr.push(arr[i]) : rightArr.push(arr[i]) } console.log('小於基準值的數組:'+leftArr); console.log('大於基準值的數組:'+rightArr); return quickSort(leftArr).concat(midNum,quickSort(rightArr)); } quickSort(arr);
時間複雜度 O(nlogn)
運行過程
這個運行過程是按照基準爲0號位算的;
能夠看到,快速排序和歸併排序是比較快。並且快排更容易理解更好寫一些。