国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)與算法之排序: 計(jì)數(shù)排序 (Javascript版)

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法之排序: 計(jì)數(shù)排序 (Javascript版)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

排序

  • 排序:把某個(gè)亂序的數(shù)組變成升序或降序的數(shù)組 (這里用數(shù)組來做舉例)

計(jì)數(shù)排序

  • 核心思想:通過計(jì)數(shù)而非比較來進(jìn)行排序,借助數(shù)組下標(biāo)本身就是有序的原理實(shí)現(xiàn)
  • 適用范圍:較小的非負(fù)整數(shù)序列和最小值和最大值之間的數(shù)字范圍比較合適
  • 基數(shù)排序需要新增一個(gè)計(jì)數(shù)數(shù)組(待累計(jì)數(shù)組)
    • 計(jì)數(shù)數(shù)組:即新的臨時(shí)的初始化數(shù)組用于計(jì)數(shù),需要找到原始數(shù)組中最大的值,再加1,才是這個(gè)數(shù)組的長度,存儲(chǔ) [0 ~ max]
    • 累計(jì)數(shù)組:是由計(jì)數(shù)數(shù)組計(jì)算后得到的,下標(biāo)是原數(shù)組的值,元素值是累計(jì)的個(gè)數(shù),即重復(fù)的個(gè)數(shù)

算法實(shí)現(xiàn)

1 )基礎(chǔ)版本

function countSort(list: number[]) {
	const len: number = list.length;
	if (len < 2) return;
	// 獲取最大值
	// const max = Math.max.apply(null, list);
	const max: number = Math.max(...list);
	// 初始化計(jì)數(shù)數(shù)組
	const countList: number[] = new Array(max + 1).fill(0); // 數(shù)組大小,存放[0~max]
	// 對(duì)原數(shù)組的數(shù)據(jù)在計(jì)數(shù)數(shù)組中累計(jì),原數(shù)組的值是計(jì)數(shù)數(shù)組的下標(biāo)
	let i: number;
	for(i = 0; i < len; i++) countList[list[i]]++; // 遍歷完成后計(jì)數(shù)數(shù)組就變成了累計(jì)數(shù)組
	// 基于累計(jì)數(shù)組生成排好序的數(shù)組,這里利用了下標(biāo)即是有序的原理
	i = 0; // 重新使用i
	for(let j: number = 0; j < max + 1; j++) {
    	// 內(nèi)層循環(huán)不會(huì)到n, 一般是常數(shù)級(jí)別的,但是這樣寫似乎也不是太好,嵌套會(huì)增加時(shí)間復(fù)雜度
		for (let k: number = 0; k < countList[j]; k++) list[i++] = j; // 這里j就是下標(biāo),其實(shí)就是原數(shù)組的值
	}
}

const list = [2, 3, 8, 7, 1, 2, 2, 2, 7, 3, 9, 8, 2, 1, 4, 2, 4, 6, 9, 2];
countSort(list);
console.log(list); // [1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 6, 7, 7, 8, 8, 9, 9]

2 )優(yōu)化版本:優(yōu)化時(shí)間復(fù)雜度(空間換時(shí)間)

function countSort(list: number[]): number[] {
	const len: number = list.length;
	if (len < 2) return list;
	// 獲取最大值和最小值
	// const max = Math.max.apply(null, list);
	// const min = Math.min.apply(null, list);
	const max: number = Math.max(...list);
	const min: number = Math.min(...list);
	// 初始化計(jì)數(shù)數(shù)組
	const countList: number[] = new Array(max - min + 1).fill(0);
	// 對(duì)原數(shù)組的數(shù)據(jù)在計(jì)數(shù)數(shù)組中累計(jì),原數(shù)組的值是計(jì)數(shù)數(shù)組的下標(biāo)
	for(let i: number = 0; i < len; i++) countList[list[i] - min]++; // 遍歷完成后計(jì)數(shù)數(shù)組就變成了累計(jì)數(shù)組
	// 基于累計(jì)數(shù)組生成排好序的數(shù)組,這里利用了下標(biāo)即是有序的原理
	let result: number[] = [];
	for(let j: number = 0; j < max + 1; j++) {
		if (!countList[j]) continue;
		countList[j] > 1 ? (result = result.concat(new Array(countList[j]).fill(j + min))) : result.push(j + min);
	}
	return result; // 替換
}

const list: number[] = [102, 103, 108, 107, 101, 102, 102, 102, 107, 103, 109, 108, 102, 101, 104, 102, 104, 106, 109, 102];
const result: number[] = countSort(list);
console.log(result); // [101, 101, 102, 102, 102, 102, 102, 102, 102, 103, 103, 104, 104, 106, 107, 107, 108, 108, 109, 109]

3 )優(yōu)化版本:優(yōu)化時(shí)間復(fù)雜度(空間換時(shí)間) + 優(yōu)化存儲(chǔ)空間

function countSort(list: number[]) {
	const len: number = list.length;
	if (len < 2) return list;
	// 獲取最大值和最小值
	const max: number = Math.max(...list);
	const min: number = Math.min(...list);
	// 初始化計(jì)數(shù)數(shù)組
	const countList: number[] = new Array(max - min + 1).fill(0);
	// 對(duì)原數(shù)組的數(shù)據(jù)在計(jì)數(shù)數(shù)組中累計(jì),原數(shù)組的值是計(jì)數(shù)數(shù)組的下標(biāo)
	for(let i: number = 0; i < len; i++) countList[list[i] - min]++; // 遍歷完成后計(jì)數(shù)數(shù)組就變成了累計(jì)數(shù)組
	// 基于累計(jì)數(shù)組生成排好序的數(shù)組,這里利用了下標(biāo)即是有序的原理
	let str: string = ''; // 用字符串來處理
	for(let j: number = 0; j < max - min + 1; j++) {
		if (!countList[j]) continue;
		str += countList[j] > 1 ? ((j + min) + ',').repeat(countList[j]) : (j + min) + ',';
	}
	str = str.substring(0, str.length - 1); // 最后一個(gè) , 是多余的
	return str.split(',').map(item => Number(item));
}

const list: number[] = [102, 103, 108, 107, 101, 102, 102, 102, 107, 103, 109, 108, 102, 101, 104, 102, 104, 106, 109, 102];
const result: number[] = countSort(list);
console.log(result); // [101, 101, 102, 102, 102, 102, 102, 102, 102, 103, 103, 104, 104, 106, 107, 107, 108, 108, 109, 109]

4 )優(yōu)化版本:優(yōu)化時(shí)間復(fù)雜度(累計(jì)數(shù)組變位置數(shù)組,基于差值和位置來對(duì)應(yīng)順序)文章來源地址http://www.zghlxwxcb.cn/news/detail-738400.html

function countSort(list: number[]) {
	const len: number = list.length;
	if (len < 2) return;
	// 獲取最大值和最小值
	const max: number = Math.max(...list);
	const min: number = Math.min(...list);
	// 初始化計(jì)數(shù)數(shù)組
	const countList: number[] = new Array(max - min + 1).fill(0);
	// 初始化目標(biāo)數(shù)組
	const result: number[] = new Array(len);
	// 對(duì)原數(shù)組的數(shù)據(jù)在計(jì)數(shù)數(shù)組中累計(jì),原數(shù)組的值是計(jì)數(shù)數(shù)組的下標(biāo)
	for(let i: number = 0; i < len; i++) countList[list[i] - min]++; // 遍歷完成后計(jì)數(shù)數(shù)組就變成了累計(jì)數(shù)組
	// 計(jì)算位置: 由上面的累計(jì)結(jié)果,計(jì)算累加后的位置, countList數(shù)組從累計(jì)數(shù)組,變成了位置數(shù)組
	for(let j: number = 1; j < max - min + 1; j++) {
		countList[j] += countList[j - 1];
	}
	// 根據(jù)累加后的位置, 將原數(shù)組中的數(shù)據(jù)按照位置進(jìn)行分配,就得到排好序的數(shù)組,備注:數(shù)據(jù)可能重復(fù),使用過的數(shù)據(jù)記得-1,從后向前遍歷更好理解
	for (let k: number = len - 1; k >= 0; k--) {
		const currentIndex = countList[list[k] - min] - 1;
		result[currentIndex] = list[k]; // 將原數(shù)組的當(dāng)前元素整合到 result數(shù)組對(duì)應(yīng)的位置之中
		countList[list[k] - min] --; // 使用一次后,累計(jì)的數(shù)量自減,防止重復(fù)使用導(dǎo)致錯(cuò)誤
	}
	list.splice(0, len, ...result); // 優(yōu)化下方式,不用return, 直接替換
}

const list: number[] = [102, 103, 108, 107, 101, 102, 102, 102, 107, 103, 109, 108, 102, 101, 104, 102, 104, 106, 109, 102];
countSort(list);
console.log(list); // [101, 101, 102, 102, 102, 102, 102, 102, 102, 103, 103, 104, 104, 106, 107, 107, 108, 108, 109, 109]

總結(jié)

  • 計(jì)數(shù)排序的適用范圍有限:最優(yōu)版時(shí)間復(fù)雜度可降低到 O(n), 是最快的排序算法, 但是有兩個(gè)前提需要滿足
    • 1)需要排序的元素必須是非負(fù)整數(shù)(下標(biāo)不能是負(fù)數(shù)和小數(shù))
      • 如果是小數(shù),需要將全部元素同等擴(kuò)大到整數(shù),之后再回歸到小數(shù)
      • 一般不考慮這種小數(shù)場景
    • 2)排序元素的取值要在一定范圍內(nèi),并且比較集中(量大,范圍小)
  • 滿足以上兩個(gè)條件,才能最大發(fā)揮出計(jì)數(shù)排序的優(yōu)勢(shì), 否則不適用
  • 計(jì)數(shù)排序的缺點(diǎn)
    • 基礎(chǔ)版空間浪費(fèi),優(yōu)化版解決了這個(gè)問題
    • 將數(shù)組長度定為 max-min+1, 即不僅要找出最大值,還要找出最小值
  • 缺點(diǎn)彌補(bǔ):根據(jù)兩者的差來確定計(jì)數(shù)數(shù)組的長度則可彌補(bǔ)之
  • 計(jì)數(shù)排序是非常穩(wěn)定的排序算法,但是適用場景確實(shí)有限
  • 計(jì)數(shù)排序是一種桶排序的思想

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法之排序: 計(jì)數(shù)排序 (Javascript版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)與算法】萬字剖析八大排序(直接插入排序、希爾排序、選擇排序、堆排序、冒泡排序、快速排序、歸并排序、計(jì)數(shù)排序)

    【數(shù)據(jù)結(jié)構(gòu)與算法】萬字剖析八大排序(直接插入排序、希爾排序、選擇排序、堆排序、冒泡排序、快速排序、歸并排序、計(jì)數(shù)排序)

    初窺直接插入排序我們先來看一張動(dòng)圖: 由動(dòng)圖我們可以分析出直接插入排序是從 第二個(gè)數(shù)據(jù)開始遍歷 ,與 前面的數(shù)據(jù)進(jìn)行比較 如果小于 則讓前面的數(shù)據(jù)向前移動(dòng) 自己接著向前面的數(shù)據(jù)比較 直到比較到 大于等于自己的 數(shù)據(jù)或者 沒有數(shù)據(jù)能進(jìn)行比較 時(shí)停止 插入當(dāng)前的位

    2023年04月13日
    瀏覽(107)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】JavaScript實(shí)現(xiàn)排序算法

    【數(shù)據(jù)結(jié)構(gòu)與算法】JavaScript實(shí)現(xiàn)排序算法

    一、大O表示法 大O表示法: 在計(jì)算機(jī)中采用 粗略的度量 來描述計(jì)算機(jī)算法的 效率 ,這種方法被稱為 “大O”表示法 在 數(shù)據(jù)項(xiàng)個(gè)數(shù) 發(fā)生改變時(shí), 算法的效率 也會(huì)跟著改變。所以說算法A比算法B快兩倍,這樣的比較是 沒有意義 的。 因此我們通常使用 算法的速度 隨著 數(shù)據(jù)

    2024年02月02日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)】——?dú)w并排序和計(jì)數(shù)排序

    【數(shù)據(jù)結(jié)構(gòu)】——?dú)w并排序和計(jì)數(shù)排序

    ??個(gè)人主頁:_麥麥_ ??今日名言:繁華落盡,我心中仍有花落的聲音。一朵,一朵,在無人的山間輕輕飄落?!饺亍锻┗ā?目錄 一、前言 二、正文 1.歸并排序 1.1 基本思想 1.2【遞歸版】具體實(shí)現(xiàn)? 1.3【遞歸版】代碼部分? 1.4【非遞歸版】具體實(shí)現(xiàn)? 1.5【非遞歸版】

    2023年04月15日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】排序之歸并排序與計(jì)數(shù)排序

    【數(shù)據(jù)結(jié)構(gòu)】排序之歸并排序與計(jì)數(shù)排序

    個(gè)人主頁 : zxctsclrjjjcph 文章封面來自:藝術(shù)家–賢海林 如有轉(zhuǎn)載請(qǐng)先通知 在前面的文章中介紹了 插入排序和交換排序,今天來分享的是歸并排序和計(jì)數(shù)排序。 話不多說,正文開始。 歸并排序既是內(nèi)排序也是外排序。 基本思想: 歸并排序(MERGE-SORT)是建立在歸并操作上的

    2024年01月17日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】-計(jì)數(shù)排序

    【數(shù)據(jù)結(jié)構(gòu)】-計(jì)數(shù)排序

    ??作者:小樹苗渴望變成參天大樹 ?? 作者宣言:認(rèn)真寫好每一篇博客 ??作者gitee:link 如 果 你 喜 歡 作 者 的 文 章 ,就 給 作 者 點(diǎn) 點(diǎn) 關(guān) 注 吧! 答應(yīng)大家的計(jì)數(shù)排序今天它來了,這也是一個(gè)非常巧妙的方法,不通過比較元素的大小就可以排序出來,通過用另一個(gè)人數(shù)組

    2023年04月17日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)——?dú)w并排序和計(jì)數(shù)排序的介紹

    數(shù)據(jù)結(jié)構(gòu)——?dú)w并排序和計(jì)數(shù)排序的介紹

    歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治(Divide andConquer)的一個(gè)非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列。即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為二路歸并。

    2024年02月11日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)——lesson13排序之計(jì)數(shù)排序

    數(shù)據(jù)結(jié)構(gòu)——lesson13排序之計(jì)數(shù)排序

    hello hello~ ,這里是大耳朵土土垚~???? ,歡迎大家點(diǎn)贊????關(guān)注????收藏?????? ?? 個(gè)人主頁:大耳朵土土垚的博客 ?? 所屬專欄:數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記 、排序算法合集 ??對(duì)于數(shù)據(jù)結(jié)構(gòu)順序表、鏈表、堆以及排序有疑問的都可以在上面數(shù)據(jù)結(jié)構(gòu)專欄和排序合集專欄進(jìn)行

    2024年04月10日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)初階】八大排序(三)——?dú)w并排序&&計(jì)數(shù)排序

    【數(shù)據(jù)結(jié)構(gòu)初階】八大排序(三)——?dú)w并排序&&計(jì)數(shù)排序

    大家好我是沐曦希?? 往期博客:【數(shù)據(jù)結(jié)構(gòu)初階】八大排序(一)——希爾排序堆排序直接插入排序直接選擇排序 【數(shù)據(jù)結(jié)構(gòu)初階】八大排序(二)——快速排序冒泡排序 歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一

    2024年02月03日
    瀏覽(89)
  • 【C語言】數(shù)據(jù)結(jié)構(gòu)——排序三(歸并與計(jì)數(shù)排序)

    【C語言】數(shù)據(jù)結(jié)構(gòu)——排序三(歸并與計(jì)數(shù)排序)

    ??個(gè)人主頁?? ?個(gè)人專欄——數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)? ??點(diǎn)擊關(guān)注??一起學(xué)習(xí)C語言???? 我們?cè)谇懊鎸W(xué)習(xí)了排序,包括直接插入排序,希爾排序,選擇排序,堆排序,冒泡排序和快排。 今天我們來講一講歸并排序和計(jì)數(shù)排序。 關(guān)注博主或是訂閱專欄,掌握第一消息。 歸并排序的

    2024年01月19日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】歸并排序的兩種實(shí)現(xiàn)方式與計(jì)數(shù)排序

    【數(shù)據(jù)結(jié)構(gòu)】歸并排序的兩種實(shí)現(xiàn)方式與計(jì)數(shù)排序

    前言:在前面我們講了各種常見的排序,今天我們就來對(duì)排序部分收個(gè)尾,再來對(duì)歸并排序通過遞歸和非遞歸的方法進(jìn)行實(shí)現(xiàn),與對(duì)計(jì)數(shù)排序進(jìn)行簡單的學(xué)習(xí)。 ?? 博主CSDN主頁:衛(wèi)衛(wèi)衛(wèi)的個(gè)人主頁 ?? ?? 專欄分類:數(shù)據(jù)結(jié)構(gòu) ?? ??代碼倉庫:衛(wèi)衛(wèi)周大胖的學(xué)習(xí)日記?? ??關(guān)注博

    2024年01月18日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包