JS實(shí)現(xiàn)的計(jì)數(shù)排序與基數(shù)排序算法示例
本文實(shí)例講述了JS實(shí)現(xiàn)的計(jì)數(shù)排序與基數(shù)排序算法。分享給大家供大家參考,具體如下:
計(jì)數(shù)排序
計(jì)數(shù)排序就是簡單的桶排序,一個(gè)桶代表數(shù)組中一個(gè)數(shù)出現(xiàn)的個(gè)數(shù),所以需要一個(gè)和數(shù)組數(shù)字范圍一樣大的輔助數(shù)組,一般用在范圍小于100的排序,時(shí)間復(fù)雜度為O(n),空間復(fù)雜度為數(shù)組的數(shù)字范圍。
/** * 范圍在 start - end 之間的排序 * 計(jì)數(shù)排序需要輔助數(shù)組,該輔助數(shù)組的長度是待排序數(shù)組的范圍,所以一般用作范圍小于100的排序 */ function countSort(arr, start, end) { var len = arr.length; // 桶數(shù)組 var suportArr = new Array(end - start + 1); // 結(jié)果數(shù)組 var resArr = new Array(len); // 初始化桶數(shù)組 for (i = 0; i < suportArr.length; i++) { suportArr[i] = 0; } // 待排序數(shù)組中的數(shù)組出現(xiàn),在桶子對(duì)應(yīng)位置+1代表這個(gè)數(shù)出現(xiàn)的個(gè)數(shù)+1了 for (let i = 0; i < len; i++) { suportArr[arr[i]]++; } // 從第1項(xiàng)開始,桶數(shù)組加上前一個(gè)桶的個(gè)數(shù),現(xiàn)在輔助數(shù)組的意義變成了每一項(xiàng)的排名了。 for (let i = 1; i < suportArr.length; i++) { suportArr[i] += suportArr[i - 1]; } // 根據(jù)輔助數(shù)組的排名,從后往前賦值 for (let i = len - 1; i >= 0; i--) { resArr[suportArr[arr[i]] - 1] = arr[i]; suportArr[arr[i]]--; } return resArr; }
基數(shù)排序
基數(shù)排序是多躺的桶排序
var radix = 16; // 基數(shù),可以為任何數(shù),越大趟數(shù)越小,但是桶數(shù)越多,最好根據(jù)最大數(shù)字進(jìn)行定義。 function _roundSort(arr, round, radix) { var buckets = new Array(radix); for (let i = 0; i < radix; i++) { buckets[i] = []; } // 將數(shù)組中的數(shù)放進(jìn)對(duì)應(yīng)的桶子中 for (let i = 0; i < arr.length; i++) { let remainder = Math.floor(arr[i] / (radix ** (round - 1))) % radix; buckets[remainder].push(arr[i]); } // 將數(shù)組重新根據(jù)桶子進(jìn)行排序 var index = 0; for (let i = 0; i < buckets.length; i++) { for (let j = 0; j < buckets[i].length; j++) { arr[index++] = buckets[i][j]; } } } function radixSort(arr, round) { for (let i = 1; i <= round; i++) { _roundSort(arr, i, radix); } return arr; } console.log(radixSort([10,5,5,50,0,155,4622,5,1,4,2154], 4));
PS:這里再為大家推薦一款關(guān)于排序的演示工具供大家參考:
在線動(dòng)畫演示插入/選擇/冒泡/歸并/希爾/快速排序算法過程工具:
http://tools.jb51.net/aideddesign/paixu_ys
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
一個(gè)無限級(jí)XML綁定跨框架菜單(For IE)
一個(gè)無限級(jí)XML綁定跨框架菜單(For IE)...2007-01-01Javascript的嚴(yán)格模式strict mode詳細(xì)介紹
這篇文章主要介紹了Javascript的嚴(yán)格模式strict mode詳細(xì)介紹,重點(diǎn)介紹了嚴(yán)格模式的使用方法及使用strict mode后對(duì)javascript語法上帶來的改變,需要的朋友可以參考下2014-06-06js?剪切、復(fù)制、粘貼功能實(shí)現(xiàn)
Navigator.clipboard?API可以用來訪問系統(tǒng)剪貼板,可以實(shí)現(xiàn)【剪切、復(fù)制、粘貼】功能。該?API?被設(shè)計(jì)用來取代使用?document.execCommand()?的剪貼板訪問方式,不兼容?IE2023-05-05javascript作用域容易記錯(cuò)的兩個(gè)地方分析
javascript作用域容易記錯(cuò)的兩個(gè)地方分析,學(xué)習(xí)js的朋友可以參考下2012-06-06electronjs實(shí)現(xiàn)打開的網(wǎng)頁密碼自動(dòng)保存功能(實(shí)現(xiàn)步驟)
在 Electron 的渲染進(jìn)程中,可以使用 webContents 對(duì)象來監(jiān)聽網(wǎng)絡(luò)請(qǐng)求,在 Electron 中實(shí)現(xiàn)自動(dòng)保存網(wǎng)頁密碼的功能涉及到幾個(gè)步驟,下面給大家分享實(shí)現(xiàn)思路,感興趣的朋友跟隨小編一起看看吧2024-08-08