javascript
將數據存儲在一個數組中 let array = [2,2,1,9,9,9,9,9]java
描述:在遍歷過程當中,利用多數元素的特性,採用抵消的方式,例如數據爲 3 1 2 3 5 3 3 3 3 ,將3和1去掉後數組爲2 3 5 3 3 3 3,多數元素仍然是3,不發生任何影響算法
利用這樣特色咱們能夠寫出算法,採用遞歸的方式,代碼以下數組
function candidate(array,k,n) {
var c = array[k]
var count = 1
let i
for(i = k + 1; i < n && count > 0; i++) {
if(array[i] === c) {
count ++
} else {
count --
}
}
if(i === n) {
// 驗證是否超過數組長度的一半
if (isArrLen2(array,c)) {
return c
} else {
return null
}
} else {
return candidate(array,i,n)
}
}
function isArrLen2(array,c) {
let count = 0
for(let j = 0; j < array.length; j++) {
if(array[j] === c) {
count ++
}
}
if(count > array.length / 2) {
return true
} else {
return false
}
}
複製代碼
實現思路: 將數組(array)開始座標值(k)以及數組長度(n)傳入到函數中,用變量c來保存當前要遍歷查找的值,用變量count來計算數量,接下來採用for循環來遍歷數組,若是數組中有變量值等於c,count加1,不然count-1,這個過程就至關於在一個一個的抵消掉,退出循環後判斷判斷i是否等於n,若是等於說明數組遍歷完成,則查找出來的這個值必定會是最優解,那麼只需判斷該值出現的次數是否大於數組長度的一半(方法:isArrLen2(array,c)),若是是,返回該值,不然返回null,當循環後i不等於n,則說明數組沒有遍歷完,那麼利用遞歸,繼續遍歷數組直到遍歷結束.該算法只須要遍歷兩遍數組,一遍是利用不相等的值抵消掉查找最優解,第二遍是遍歷該數組查看最優節是否是多數元素。事件複雜的爲2n,用到了算法的概括,查找問題中的一些小規律bash
函數
將數據存儲在一個數組中 var arr = [3,5,7,1,4,56,12,78,25,0,9,8,42,37]測試
描述:把長度爲n的輸入序列分紅兩個長度爲n/2的子序列,而後對這兩個子序列分別採用歸併排序,最後將兩個排序好的子序列合併成一個最終的排序序列ui
採用了遞歸,算法代碼以下:(語言javascript)spa
function mergeSort(arr) {
let len = arr.length
if (len < 2) {
return arr
}
let mid = Math.floor(len / 2)
let left = arr.slice(0,mid)
let right = arr.slice(mid)
return merge(mergeSort(left),mergeSort(right))
}
function merge(left,right) {
let result = []
while(left.length > 0 && right.length > 0) {
if (left[0] <= right[0]) {
result.push(left.shift())
} else {
result.push(right.shift())
}
}
while (left.length) {
result.push(left.shift())
}
while (right.length) {
result.push(right.shift())
}
return result
}
複製代碼
將數組傳入函數mergeSort(arr),將數組切割爲兩部分,若是數組長度大於2的話,那麼繼續切割,直到數組中只有兩個元素,就不切割開始排序,排序過程當中分別對左右兩邊進行排序。定義一個結果集result,採用while循環,若是left.length和right.length的長度(也就是切割後的左右兩邊數組長度不爲空,那就繼續排序),排序採用進棧退棧的方式,比較左右兩邊數組值得大小,將左右兩邊數組較小的值從數組中退棧,而後將該值壓棧,push到result結果集中,比較完成後,數組中會剩下最大的那個值,而後判斷左右兩邊數組長度是否爲0,若有還有值,若是有,則壓棧進入到result結果集中,最後一層一層遞歸數組,最終result集中爲排好序的數組。code
測試數據:var array = [1,25,7,89,11,135,8964,23,77,1967,54,8932893,25631,22563,7412]
描述:利用數值的位數進行排序,右個位到十位再到百位...
算法代碼實現以下:(語言javascript)
var k = 7 // 最大位數
// 基數排序
function redixSort(array,k) {
var flag = []
var index = 0
for(let i = 0; i < k; i++) {
for(let j = 0; j <= 9; j++) {
for(let m = 0; m < array.length; m++) {
if(Math.floor((array[m] / Math.pow(10,i) % 10)) === j) {
flag.push(array[m])
}
}
}
array = flag
flag = []
}
return array
}
console.log(redixSort(array,k))
複製代碼
這裏k值位最大位數,由於測試數據最大位數爲7,我就寫死了k=7,固然也能夠寫一個方法去求,我這裏爲了方便就沒寫了。
思路:採用了三重循環,第一從爲遍歷位數(這裏爲7),第二重循環爲0-9遍歷位的值,第三重循環爲遍歷數組。
for(let j = 0; j <= 9; j++) {
for(let m = 0; m < array.length; m++) {
if(Math.floor((array[m] / Math.pow(10,i) % 10)) === j) {
flag.push(array[m])
}
}
}
複製代碼
該式子位求對應位上的數值 Math.floor((array[m] / Math.pow(10,i) % 10)) 二重循環,外循環遍歷0-9,也就是位上的值,內循環遍歷數組,外循環遍歷時,將數組中相應位的大小按0-9排序,而且壓棧進入到flag數組中,即第一遍循環將數組中位數爲0的值壓棧進入flag,第二遍爲1,第三遍爲2...,
而後在外面遍歷沒一個位,第一次個位,第二次十位,第三次百位...直至遍歷位數結束 遍歷每一位後,須要將排好序的數組flag的值賦予給原數組array,並將數組flag至爲空
遍歷數組次數爲10*7(位數)*array.length ,若是數據小的話不建議用基數排序,若是數據龐大的話,那麼基數排序就頗有用了
有錯之處歡迎指出,若是您以爲寫得還湊合的話那就幫我點個贊啦~ 但願能夠幫到您哈~