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),在桶子對應(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)對應(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é)》
希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
bootstrap里bootstrap動(dòng)態(tài)加載下拉框的實(shí)例講解
今天小編就為大家分享一篇bootstrap里bootstrap動(dòng)態(tài)加載下拉框的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
js自動(dòng)生成的元素與頁面原有元素發(fā)生堆疊的解決方法
js自動(dòng)生成的元素與頁面原有元素發(fā)生堆疊通過去除浮動(dòng),給原有元素(商品擴(kuò)展信息部分)加上clear:both; 果然正常了2013-10-10
文本框(input)獲取焦點(diǎn)(onfocus)時(shí)樣式改變的示例代碼
本篇文章主要是對文本框(input)獲取焦點(diǎn)(onfocus)時(shí)樣式改變的示例代碼進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01
js模仿微信朋友圈計(jì)算時(shí)間顯示幾天/幾小時(shí)/幾分鐘/幾秒之前
本篇文章主要介紹了js模仿微信朋友圈計(jì)算時(shí)間顯示幾天/幾小時(shí)/幾分鐘/幾秒之前的實(shí)例。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04
JavaScript使用Promise實(shí)現(xiàn)分批處理接口請求
當(dāng)我們在實(shí)際項(xiàng)目中遇到需要批量發(fā)起上百條接口請求怎么辦呢,本文就來為大家介紹一下JavaScript如何使用Promise實(shí)現(xiàn)分批處理接口請求,需要的小伙伴可以參考一下2023-11-11
JavaScript實(shí)現(xiàn)滑塊驗(yàn)證解鎖
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)滑塊驗(yàn)證解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01

